2
我試圖爲獲得字符爲日本String.I給定的位置正在逐漸編碼問題(4字節日文字符)
「?"
代替漢字的專門爲4個字節。
下面是代碼片斷我試圖執行。
String jp="";
我試圖通過
打印這個字符串的第一個字符請提供合適的解決方案。
我們試着用UTF-8
編碼。
我試圖爲獲得字符爲日本String.I給定的位置正在逐漸編碼問題(4字節日文字符)
「?"
代替漢字的專門爲4個字節。
下面是代碼片斷我試圖執行。
String jp="";
我試圖通過
打印這個字符串的第一個字符請提供合適的解決方案。
我們試着用UTF-8
編碼。
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)); //
嗨Esailija感謝您post.The問題也來爲子可以嗎請建議我。 – Nani
@Srinu是的,我會添加子串的例子。 – Esailija
您好Esailija爲stringAt()的職位不工作,如果我給字符串值字符串jp =「abcv」,我想獲得stringAt(jp,2)輸出是「?」,請你指教我。 – Nani