我正在尝试获得日语String给定位置的角色。我正在
“?"
而不是专门用于4字节的字符。
以下是我尝试执行的代码段。
String jp="";
我正在尝试通过
打印此String中的第一个字符jp.charAt(0)
ouput="?"
请告知合适的解决方案。
我们尝试使用UTF-8
编码。
答案 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)); //