private static String gbToUnicode(String s){ StringBuffer sb = new StringBuffer(); StringTokenizer st = new StringTokenizer(s, "\\u"); while (st.hasMoreTokens()) { sb.append(st.nextToken()); } return sb.toString(); }
public static String loadConvert(String theString) { char aChar; int len = theString.length(); StringBuffer outBuffer = new StringBuffer(len); for (int x=0; x<len; ) { aChar = theString.charAt(x++); if (aChar == '\\') { aChar = theString.charAt(x++); if (aChar == 'u') { // Read the xxxx int value=0; for (int i=0; i<4; i++) { aChar = theString.charAt(x++); switch (aChar) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': value = (value << 4) + aChar - '0'; break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': value = (value << 4) + 10 + aChar - 'a'; break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': value = (value << 4) + 10 + aChar - 'A'; break; default: throw new IllegalArgumentException( "Malformed \\uxxxx encoding."); } } outBuffer.append((char)value); } else { if (aChar == 't') aChar = '\t'; else if (aChar == 'r') aChar = '\r'; else if (aChar == 'n') aChar = '\n'; else if (aChar == 'f') aChar = '\f'; outBuffer.append(aChar); } } else outBuffer.append(aChar); } return outBuffer.toString(); }
晕,kingfish啊,我回去试了,一下,按你的弄法private static String gbToUnicode(String s){ StringBuffer ss = new StringBuffer(); for(int i=0;i<s.length();++i){ ss.append("\\u"+Integer.toHexString(s.charAt(i))); } String temp = new String(ss); return temp; } private static String unicodeToGB(String s){ StringBuffer sb = new StringBuffer(); StringTokenizer st = new StringTokenizer(s, "\\u"); while (st.hasMoreTokens()) { sb.append(st.nextToken()); } return sb.toString(); } public static void main(String[] args) { String ch="中文"; String un=gbToUnicode(ch); String gb=unicodeToGB(un); System.out.println(gb);} 最后显示的是4e2d6587,而不是"中文",所以还有点问题的啊.
System.out.println(un);
这样直接就输出中文了
他表示的是在一个范围之内,具体我不记得了
只要在这个范围里面直接输出就没有问题
这个中文字符串要作为String 返回的呢?
这就是避免出现中文乱码的办法
private static String gbToUnicode(String s);
传进去的s就是Unicode,如何得到要返回的String 呢?
private static String gbToUnicode(String s){
StringBuffer sb = new StringBuffer();
StringTokenizer st = new StringTokenizer(s, "\\u");
while (st.hasMoreTokens()) {
sb.append(st.nextToken());
}
return sb.toString();
}
char aChar;
int len = theString.length();
StringBuffer outBuffer = new StringBuffer(len); for (int x=0; x<len; ) {
aChar = theString.charAt(x++);
if (aChar == '\\') {
aChar = theString.charAt(x++);
if (aChar == 'u') {
// Read the xxxx
int value=0;
for (int i=0; i<4; i++) {
aChar = theString.charAt(x++);
switch (aChar) {
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
value = (value << 4) + aChar - '0';
break;
case 'a': case 'b': case 'c':
case 'd': case 'e': case 'f':
value = (value << 4) + 10 + aChar - 'a';
break;
case 'A': case 'B': case 'C':
case 'D': case 'E': case 'F':
value = (value << 4) + 10 + aChar - 'A';
break;
default:
throw new IllegalArgumentException(
"Malformed \\uxxxx encoding.");
}
}
outBuffer.append((char)value);
} else {
if (aChar == 't') aChar = '\t';
else if (aChar == 'r') aChar = '\r';
else if (aChar == 'n') aChar = '\n';
else if (aChar == 'f') aChar = '\f';
outBuffer.append(aChar);
}
} else
outBuffer.append(aChar);
}
return outBuffer.toString();
}
StringBuffer ss = new StringBuffer();
for(int i=0;i<s.length();++i){
ss.append("\\u"+Integer.toHexString(s.charAt(i)));
}
String temp = new String(ss);
return temp;
}
private static String unicodeToGB(String s){
StringBuffer sb = new StringBuffer();
StringTokenizer st = new StringTokenizer(s, "\\u");
while (st.hasMoreTokens()) {
sb.append(st.nextToken());
}
return sb.toString();
}
public static void main(String[] args) {
String ch="中文";
String un=gbToUnicode(ch);
String gb=unicodeToGB(un);
System.out.println(gb);}
最后显示的是4e2d6587,而不是"中文",所以还有点问题的啊.
StringBuffer sb = new StringBuffer();
StringTokenizer st = new StringTokenizer(s, "\\u");
while (st.hasMoreTokens()) {
sb.append( (char) Integer.parseInt(st.nextToken(), 16));
}
return sb.toString();
}