编码问题(4字节日文字符)

时间:2012-11-12 10:20:10

标签: java

我正在尝试获得日语String给定位置的角色。我正在

?"   而不是专门用于4字节的字符。

以下是我尝试执行的代码段。

 String jp="";

我正在尝试通过

打印此String中的第一个字符
jp.charAt(0)




ouput="?"

请告知合适的解决方案。

我们尝试使用UTF-8编码。

1 个答案:

答案 0 :(得分: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平台在char数组中使用UTF-16表示   在String和StringBuffer类中。

因此输入也可能是UTF-8,但它不会改变内部表示和随之而来的问题。只有UTF-32才是真正固定宽度的编码,其中一个char只能真正代表任何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)); //