2012-11-12 18 views
2

我試圖爲獲得字符爲日本String.I給定的位置正在逐漸編碼問題(4字節日文字符)

?" 代替漢字的專門爲4個字節。

下面是代碼片斷我試圖執行。

String jp=""; 

我試圖通過

打印這個字符串的第一個字符

請提供合適的解決方案。

我們試着用UTF-8編碼。

回答

5

Java無法將這些字符表示爲char,因爲它們需要2個UTF-16單元來表示。 charAt這裏給你的只有上半場,這一點沒有意義。請參閱http://en.wikipedia.org/wiki/UTF-16

你可以做這樣的事情:通過人物

import java.lang.Character; 

... 

    public static String stringAt(String str, int index) 
    { 
     int codePoint = Character.codePointAt(str, index); 
     return new String(Character.toChars(codePoint)); 
    } 

    public static void main(String args[]) 
    { 
     String jp=""; 


     System.out.println(stringAt(jp, 0)); //Prints 

    } 

... 

要循環,你會怎麼做:

String jp=""; 
    int len = jp.length(); 
    for(int i = 0; i < len; ++i) { 
     String character = stringAt(jp, i); 

     i += (character.length() -1); 
     System.out.println(character); 
    } 
    // 
    // 
    // 
    // 

需要注意的是:

Java 2平臺使用字符數組中的UTF-16表示以及String和StringBuffer類中的 。

因此,輸入也可能是UTF-8,但它不會改變內部表示和隨之而來的問題。只有UTF-32是一種真正固定寬度的編碼,其中一個字符可以真正代表任何unicode字符。

編輯:

子串爲例(這就會乏味了,你可能想找到這個庫):

public static String substring(String str, int start, int end) { 
    int codePointIndex = 0, 
     len = str.length(); 

    StringBuilder sb = new StringBuilder(); 

    //There's no random access in variable width encoding, so 
    //loop must be used 
    for(int i = 0; i < len; ++i) { 
     String character = stringAt(str, i); 
     if(codePointIndex >= start) { 
      sb.append(character); 
     } 
     if(codePointIndex >= end -1) { 
      break; 
     } 
     i += (character.length() - 1); 
     codePointIndex++; 

    } 

    return sb.toString(); 

} 

    String jp = "asdf"; 
    System.out.println(substring(jp, 0,8)); // asdf 
    System.out.println(substring(jp, 0,4)); //as 
    System.out.println(substring(jp, 7,8)); // 
+0

嗨Esailija感謝您post.The問題也來爲子可以嗎請建議我。 – Nani

+0

@Srinu是的,我會添加子串的例子。 – Esailija

+0

您好Esailija爲stringAt()的職位不工作,如果我給字符串值字符串jp =「abcv」,我想獲得stringAt(jp,2)輸出是「?」,請你指教我。 – Nani