论坛首页 Java版

如何正确显示文件中读出的Unicode转义码

浏览 1080 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2007-08-28 关键字: java
有一个文本文件,直接用记事本打开是\u8001\u5E08\u544A\u8BC9\u6211\u4EEC\uFF0C这样的形式,但这是java源代码中unicode的转义形式,如果用java将文件读入,在控制台显示出来还是转义形式,那么如何将其显示为汉字呢?可以自己写代码逐字转,但有些字要用两组\u来表示,自己写很麻烦。
   
最后更新时间: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);
    }

   
0 请登录后投票
最后更新时间:2007-08-28
非常感谢。
   
0 请登录后投票
最后更新时间:2007-08-29
nwqsilence 写道
非常感谢。


Just try the following command...
native2ascii -reverse
   
0 请登录后投票
最后更新时间: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;
}

}
   
0 请登录后投票
最后更新时间: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这样的字符串。
   
0 请登录后投票
最后更新时间:2008-06-08
这段代码太有用了,做项目的时候有这样一个问题:
SOAP信息传过来的是类似& #x5BA1;& #x6838;& #x672A;& #x901A;& #x8FC7;这样的unicode字符串,这在浏览器中显示是没有问题的,但在控制台,log文件中则只能按上面的方式显示出来。
所以我就试图在将& #x转换成\u,但无论如何也无法组成一个unicode字符,组成后的都是字符串。显示的是\u5BA1;无法显示汉字。
使用codeutil提供的代码成功的将\\u5BA1类型的编码转换成汉字。
同时这段代码可以解析传入的任何字符串,只对其中的unicode进行转码,其他的部分保持不变,这正是我们大家平时做项目时想要的功能!
在此再次对codeutil表示感谢!
   
0 请登录后投票
最后更新时间:2008-06-08
codeutil 写道
老师告诉我们,要学会观察:


/*
   * Converts encoded &#92;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的。
   
0 请登录后投票
最后更新时间: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));
}

 

   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐