2011-04-20 40 views
12

Bir dizenin unicode değerini java'ya nasıl alabilirim? ÖrneğinJava Dize Unicode Değeri

dize, ben \ uXXXX \ uXXXX

Bu yöntem keyfi bir Java kaynak kodunda kullanılmak üzere bir ASCII güvenli temsil String (veya özellikleri dosyaları dönüştürür
+3

Neden? Ne ** tam olarak yapmaya çalışıyorsun? charAt() 'yardımcı olacaktır. UTF-16 kod birimleri yerine Unicode kod noktaları istiyorsanız, 'codePointAt()' daha doğru bir yaklaşımdır (ancak Java kaynak kodu veya benzeri için '\' 'escapes yazmak istiyorsanız bu yardımcı olmaz). –

+0

Her şeyi basitleştirmek için, bir java kaynak dosyasından İngilizce olan bir dizilim var. Japoncaya dönüşüyor. Daha sonra ingilizce unicode değerine ihtiyacım var, çünkü ingilizce dizgisi Japonca kaynak dosyasında değiştirilecek. – user489041

+0

@ user: bu durumda "charAt()" ile dönüş değerini 4 basamaklı bir onaltılık sayı olarak biçimlendirmek ve "\ u" harfini önceden yazmak gerekir. –

cevap

18

Bazı unicode karakterler iki Java karakterini kapsar. http://docs.oracle.com/javase/tutorial/i18n/text/unicode.html alıntı: 16 bit aralığının dışında olan ve 0x10000 den 0x10FFFF aralığında değerlere sahip

karakter, yardımcı karakterler olarak adlandırılır ve kömür değerlerinin bir çift olarak tanımlanır.

olmayan ASCII kaçmak için doğru yolu:

private static String escapeNonAscii(String str) { 

    StringBuilder retStr = new StringBuilder(); 
    for(int i=0; i<str.length(); i++) { 
    int cp = Character.codePointAt(str, i); 
    int charCount = Character.charCount(cp); 
    if (charCount > 1) { 
     i += charCount - 1; // 2. 
     if (i >= str.length()) { 
     throw new IllegalArgumentException("truncated unexpectedly"); 
     } 
    } 

    if (cp < 128) { 
     retStr.appendCodePoint(cp); 
    } else { 
     retStr.append(String.format("\\u%x", cp)); 
    } 
    } 
    return retStr.toString(); 
} 
+0

Güzel! Güzel örnek – user489041

11

gibi bir şey gerekiyor "Merhaba" ise örneğin):

public String escapeUnicode(String input) { 
    StringBuilder b = new StringBuilder(input.length()); 
    Formatter f = new Formatter(b); 
    for (char c : input.toCharArray()) { 
    if (c < 128) { 
     b.append(c); 
    } else { 
     f.format("\\u%04x", (int) c); 
    } 
    } 
    return b.toString(); 
} 
+0

Harika, mükemmel çalıştı. Teşekkürler – user489041

+1

@ user489041: Katılıyorum: Bunu yapmanın doğru yolu, java kodlama UTF-8 ile derlemektir. Dağınıklık yok, yaygara yok. Bu özellikle 20 yıldan beri, Java'nın kod adlarını resmi adlarıyla konuşmanın standart bir yolu hala mevcut değil. Bu, kodunuza kötü ve gizemli sihir numaraları eklemeyi denediğiniz anlamına gelir. Bu iyi birşey değil! Elbette, "a" dan "\ N {GREEK SMALL LETTER ALPHA}" 'yı görmeyi tercih edebilirim, fakat ** SURELY ** "\ u03B1" i görmek istemiyorum! Bu sadece kötü. Bu çeşit bir hamuru nasıl koruyacaksın? – tchrist

+0

Sadece 4 Hane? Unicode 32bit karakter kümesi ve OP Japonca konuştu. – Martin