2011-08-04 37 views
1

如何獲取字符串的編碼版本(例如\ u0421 \ u043b \ u0443 \ u0436 \ u0435 \ u0431 \ u043d \ u0430 \ u044f)使用Java?如何獲取字符串的編碼版本(例如 u0421 u043b u0443 u0436 u0435 u0431 u043d u0430 u044f)

編輯: 我想這個問題不是很清楚......基本上我想是這樣的:

給定的字符串S =「blalbla」我想串「\ UXXX \ uYYYY」

+0

您的編輯不是編輯。這是一個新問題。 –

+0

你已經標記了這個UTF-8,所以你想要UTF-8?還是你想要UCS-2(這不是一個有效的Unicode編碼)代碼單元而不是適當的邏輯Unicode代碼點? – tchrist

回答

2

您需要將每個代碼點/單元從字符串中提取與自己編碼。即使字符串中的單個語言字符由雙字母或連字組成,以下方法適用於所有字符串。

public String getUnicodeEscapes(String aString) 
{ 
    if (aString != null && aString.length() > 0) 
    { 
     int length = aString.length(); 
     StringBuilder buffer = new StringBuilder(length); 
     for (int ctr = 0; ctr < length; ctr++) 
     { 
      char codeUnit = aString.charAt(ctr); 
      String hexString = Integer.toHexString(codeUnit); 
      String padAmount = "0000".substring(hexString.length()); 
      buffer.append("\\u"); 
      buffer.append(padAmount); 
      buffer.append(hexString); 
     } 
     return buffer.toString(); 
    } 
    else 
    { 
     return null; 
    } 
} 

上面產生作爲Unicode escapes決定由Java語言規範輸出,即它產生的形式\uxxxx的輸出爲每個UTF-16 代碼單元。它通過產生表示爲\uxxxx\uyyyy的一對代碼單元來解決補充字符。

的最初發布代碼已被修改,以在格式U+FFFFF Unicode代碼點:

public String getUnicodeCodepoints(String aString) 
{ 
    if (aString != null && aString.length() > 0) 
    { 
     int length = aString.length(); 
     StringBuilder buffer = new StringBuilder(length); 
     for (int ctr = 0; ctr < length; ctr++) 
     { 
      char ch = aString.charAt(ctr); 
      if (Character.isLowSurrogate(ch)) 
      { 
       continue; 
      } 
      else 
      { 
       int codePoint = aString.codePointAt(ctr); 
       String hexString = Integer.toHexString(codePoint); 
       String zeroPad = Character.isHighSurrogate(ch) ? "00000" : "0000"; 
       String padAmount = zeroPad.substring(hexString.length()); 
       buffer.append(" U+"); 
       buffer.append(padAmount); 
       buffer.append(hexString); 
      } 
     } 
     return buffer.toString(); 
    } 
    else 
    { 
     return null; 
    } 
} 

的gruntwork由String.codePointAt()方法,該方法在一個特定的索引返回Unicode編碼點來完成。對於由組合字符組成的String實例,String實例的長度不會是可見字符數的長度,而是實際Unicode碼點的數量。例如,在梵文中組合形成क्,並且上述功能將正確地返回U+0915 U+094d而沒有任何大驚小怪,因爲String.length()將針對組合字符返回2。帶有補充字符的字符串將爲單個字符設置單個代碼點 - (該頁面不會正確顯示此字符串文字,但您可以複製該文件;它應該是Javascript,但使用補充字符集Mathematical alphanumeric symbols寫入)將返回U+1d4a5 U+1d4b6 U+1d4cb U+1d4b6 U+1d4c8 U+1d4b8 U+1d4c7 U+1d4be U+1d4c5 U+1d4c9

+0

這正是我需要的,非常感謝。 – Asterisk

+0

**該代碼錯誤!**首先,它甚至不會編譯,因爲'string'應該是函數中的'aString'。其次,它有UTF-16錯誤,因爲它忘記了'if(aString.codePointAt(ctr)> Character.MAX_VALUE){ctr ++; } // UG!'。試試像''「'來看看我的意思。這是包含九個(但不是十八個)Unicode字符的字符串:U + 1D4A5 U + 1D4B6 U + 1D4CB U + 1D4B6 U + 1D4C8 U + 1D4B8 U + 1D4C7 U + 1D4BE U + 1D4C5 U + 1D4C9'。至於結合字符,Java沒有適當的字形支持,所以你剛剛被洗淨。 – tchrist

+0

幹得好。我厭惡Java中的整個代碼單元事物;這是一個可怕的糟糕的混亂。記住refrain:* int是新的char *。我們確實需要一個可以在Unicode代碼點上正常工作的UString類,所以'length()'返回它們的計數等。太糟糕了,我們無法子類化String或者改變編譯器的文字。這些看起來不可修復,是一種詛咒。順便說一句,[喬治Doursos的Symbola字體](http://users.teilar.gr/~g1951d/)將讓你看到數學字母和更多。 – tchrist

1
public static void main(String[] args) { 
    Charset charset = Charset.forName("UTF-8"); 
    CharsetDecoder decoder = charset.newDecoder(); 
    CharsetEncoder encoder = charset.newEncoder(); 

    try { 
     ByteBuffer bbuf = encoder.encode(CharBuffer.wrap("\u0421\u043b\u0443\u0436\u0435\u0431\u043d\u0430\u044f")); 

     CharBuffer cbuf = decoder.decode(bbuf); 
     String s = cbuf.toString(); 
     System.out.println(s); 
    } catch (CharacterCodingException e) { 
     e.printStackTrace(); 
    } 
    } 
+0

給出一個字符串s我想得到它的編碼 – Asterisk

1

我不知道一個內置的解決方案,所以:

StringBuilder builder = new StringBuilder(); 
for(int i=0; i<yourString.length(); i++) { 
    builder.append(String.format("\\u%04x", yourString.charAt(i))); 
} 
String encoded = builder.toString(); 

編輯:sry,我以爲你想要得到字符串編碼爲\ uXXXX表達式...

0

你沒有說你以後是什麼編碼,但基於標籤我假設你想UTF- 8編碼。具體方法如下:

byte[] utf8 = 
    "\u0421\u043b\u0443\u0436\u0435\u0431\u043d\u0430\u044f".getBytes("UTF-8"); 

然後,您可以編寫一個簡單的循環來輸出utf8字節十六進制或十進制......或做其他事與他們。

0
System.out.println ("\u0421\u043b\u0443\u0436\u0435\u0431\u043d\u0430\u044f"); 

作品對我來說就像魅力:

Служебная