浏览 1080 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2007-08-28 关键字: java
有一个文本文件,直接用记事本打开是\u8001\u5E08\u544A\u8BC9\u6211\u4EEC\uFF0C这样的形式,但这是java源代码中unicode的转义形式,如果用java将文件读入,在控制台显示出来还是转义形式,那么如何将其显示为汉字呢?可以自己写代码逐字转,但有些字要用两组\u来表示,自己写很麻烦。
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-08-28
老师告诉我们,要学会观察:
public static void main(String[] args) throws Exception {
String ssss="\u8001\u5E08\u544A\u8BC9\u6211\u4EEC\uFF0C";
System.out.println(loadConvert(ssss.toCharArray(),0,ssss.length(),new char[0]));
}
/*
* Converts encoded \uxxxx to unicode chars
* and changes special saved chars to their original forms
*/
private static String loadConvert (char[] in, int off, int len, char[] convtBuf) {
if (convtBuf.length < len) {
int newLen = len * 2;
if (newLen < 0) {
newLen = Integer.MAX_VALUE;
}
convtBuf = new char[newLen];
}
char aChar;
char[] out = convtBuf;
int outLen = 0;
int end = off + len;
while (off < end) {
aChar = in[off++];
if (aChar == '\\') {
aChar = in[off++];
if(aChar == 'u') {
// Read the xxxx
int value=0;
for (int i=0; i<4; i++) {
aChar = in[off++];
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.");
}
}
out[outLen++] = (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';
out[outLen++] = aChar;
}
} else {
out[outLen++] = (char)aChar;
}
}
return new String (out, 0, outLen);
}
|
|
| 返回顶楼 | |
|
最后更新时间:2007-08-28
非常感谢。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-08-29
nwqsilence 写道 非常感谢。
Just try the following command... native2ascii -reverse |
|
| 返回顶楼 | |
|
最后更新时间:2007-08-29
package charEnCodeAndDecodeTool字符编码工具;
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; import wen.allMyTools.file.FileCommon; public class StringUniCode { /** * @param args */ public static void main(String[] args) { String ss2=decodeUnicode("sss\u4e2dfddd").toString(); System.out.println(ss2); } /** */ /** * This method will decode the String to a recognized String in ui. * 功能:将unicod码转为需要的格式(utf-8) * @author javajohn * @param dataStr * @return */ public static StringBuffer decodeUnicode(final String dataStr){ final StringBuffer buffer=new StringBuffer(); String tempStr=""; String operStr=dataStr; if (operStr!=null&&operStr.indexOf("\\u")==-1) return buffer.append(operStr); // if (operStr!=null&&!operStr.equals("") &&!operStr.startsWith("\\u")){ // tempStr=operStr.substring(0,operStr.indexOf("\\u")); // operStr=operStr.substring(operStr.indexOf("\\u"),operStr.length());//operStr字符一定是以unicode编码字符打头的字符串 } buffer.append(tempStr); while(operStr!=null &&!operStr.equals("") &&operStr.startsWith("\\u")){ // 循环处理,处理对象一定是以unicode编码字符打头的字符串 tempStr = operStr.substring(0 , 6); operStr = operStr.substring(6 ,operStr.length()); String charStr = "" ; charStr = tempStr.substring(2,tempStr.length()); char letter=(char)Integer.parseInt(charStr,16);//16进制parse整形字符串。 buffer.append(new Character(letter).toString()); if (operStr.indexOf("\\u")==- 1) { // buffer.append(operStr); }else {// 处理operStr使其打头字符为unicode字符 tempStr = operStr.substring(0,operStr.indexOf("\\u")); operStr = operStr.substring(operStr.indexOf("\\u"), operStr.length()); buffer.append(tempStr); } } return buffer; } } |
|
| 返回顶楼 | |
|
最后更新时间:2007-08-29
codeutil 写道 老师告诉我们,要学会观察:
public static void main(String[] args) throws Exception {
String ssss="\u8001\u5E08\u544A\u8BC9\u6211\u4EEC\uFF0C";
System.out.println(loadConvert(ssss.toCharArray(),0,ssss.length(),new char[0]));
}
/*
* Converts encoded \uxxxx to unicode chars
* and changes special saved chars to their original forms
*/
private static String loadConvert (char[] in, int off, int len, char[] convtBuf) {
if (convtBuf.length < len) {
int newLen = len * 2;
if (newLen < 0) {
newLen = Integer.MAX_VALUE;
}
convtBuf = new char[newLen];
}
char aChar;
char[] out = convtBuf;
int outLen = 0;
int end = off + len;
while (off < end) {
aChar = in[off++];
if (aChar == '\\') {
aChar = in[off++];
if(aChar == 'u') {
// Read the xxxx
int value=0;
for (int i=0; i<4; i++) {
aChar = in[off++];
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.");
}
}
out[outLen++] = (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';
out[outLen++] = aChar;
}
} else {
out[outLen++] = (char)aChar;
}
}
return new String (out, 0, outLen);
}
补充一下,二楼的程序本身没有问题的。但是main里面测试的String应该是 "\\u8001\\u5E08\\u544A\\u8BC9\\u6211\\u4EEC\\uFF0C"; 否则的话,其一是Java本身对String处理的时候就会把包含\u的字符处理成Unicode然后转换。像类似 String ssss="\u8001\u5E08\u544A\u8BC9\u6211\u4EEC\uFF0C"; 这样的String直接打印出来的时候就已经转换好了,也不用专门写函数。其二是楼主从文档里面读入的应该是\\u8001这样的字符串。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-06-08
这段代码太有用了,做项目的时候有这样一个问题:
SOAP信息传过来的是类似& #x5BA1;& #x6838;& #x672A;& #x901A;& #x8FC7;这样的unicode字符串,这在浏览器中显示是没有问题的,但在控制台,log文件中则只能按上面的方式显示出来。 所以我就试图在将& #x转换成\u,但无论如何也无法组成一个unicode字符,组成后的都是字符串。显示的是\u5BA1;无法显示汉字。 使用codeutil提供的代码成功的将\\u5BA1类型的编码转换成汉字。 同时这段代码可以解析传入的任何字符串,只对其中的unicode进行转码,其他的部分保持不变,这正是我们大家平时做项目时想要的功能! 在此再次对codeutil表示感谢! |
|
| 返回顶楼 | |
|
最后更新时间:2008-06-08
codeutil 写道 老师告诉我们,要学会观察:
/*
* Converts encoded \uxxxx to unicode chars
* and changes special saved chars to their original forms
*/
private static String loadConvert (char[] in, int off, int len, char[] convtBuf) {
。。
return new String (out, 0, outLen);
}
这段代码是从java.util.Properties中copy的。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-06-11
其实也不需要那么麻烦可以这样做。 String seqChar = "\\u8001\\u5E08\\u544A\\u8BC9\\u6211\\u4EEC\\uFF0C";
String[] seqChars = seqChar.split("\\\\u");
for(String character : seqChars) {
if(StringUtils.isNotBlank(character))
System.out.println((char) Integer.parseInt(character, 16));
}
|
|
| 返回顶楼 | |






