当前位置:编程学习 > JAVA >>

新手没多少分跪求unicode 转码问题

要转码的内容:
 \u53EF\u4E58\u516C\u4EA4758\u8DEF\u3001358\u652F\u8DEF\u3001858\u8DEF\u3001849\u8DEF\u3001984\u8DEF\u3001985\u8DEF\u3001850\u8DEF\u3001426\u8DEF\u3001464\u8DEF\u3001465\u8DEF\u3001803\u8DEF\u5230\u5929\u901A\u82D1\u4E0B\u8F66\u5F80\u56DE\u8D7050\u7C73\uFF0C\u5411\u897F\u5230\u57CE\u94C1\u4E94\u53F7\u7EBF\u4E0B\u9762\u5411\u5317200-300\u7C73\u5373\u5230\uFF0C\u6216\u4E3D\u6C34\u56ED\u4E0B\u8F66\u7A7F\u8FC7\u5929\u901A\u82D1\u4E94\u533A\u5230\u57CE\u94C1\u4E94\u53F7\u7EBF\u4E0B\u9762\u5411\u5357150-250\u7C73\u5373\u5230\uFF1B\u4E58\u5730\u94C1\u4E94\u53F7\u7EBF\u5230\u5929\u901A\u82D1\u5357\u7AD9\u4E0B\u8F66\uFF0C\u51FA\u7AD9\u5F80\u5357\u8D70\u5357300-400\u7C73\u5373\u5230\uFF1B\u7531\u5317\u5411\u5357758\u8DEF\u3001358\u652F\u3001858\u8DEF\u3001849\u8DEF\u3001984\u8DEF\u3001985\u8DEF\u3001850\u8DEF\u3001426\u8DEF\u3001464\u8DEF\u3001465\u8DEF\u3001803\u8DEF\u3001\u5730\u94C1\u4E94\u53F7\u7EBF\u5230\u5929\u901A\u82D1\u5357\u7AD9\u4E0B\u8F66\u5F80\u5357\u8D70\u5357300-400\u7C73\u5373\u5230\u3002\r\n
 
麻烦我想问下 有没有什么好的转码方式可以转出我要的结果
 
结果是这样的:
 可乘公交758路、358支路、858路、849路、984路、985路、850路、426路、464路、465路、803路到天通苑下车往回走50米,向西到城铁五号线下面向北200-300米即到,或丽水园下车穿过天通苑五区到城铁五号线下面向南150-250米即到;乘地铁五号线到天通苑南站下车,出站往南走南300-400米即到;由北向南758路、358支、858路、849路、984路、985路、850路、426路、464路、465路、803路、地铁五号线到天通苑南站下车往南走南300-400米即到。
 
我的转码代码是:
private static String decodeUnicode(String dataStr) { 
         int start = 0; 
 int end = 0; 
 final StringBuffer buffer = new StringBuffer(); 
 while( start > -1 ) { 
    end = dataStr.indexOf( "\\u", start + 2 ); 
    String charStr = ""; 
    if( end == -1 ) { 
       charStr = dataStr.substring( start + 2, dataStr.length() ); 
    } else { 
       charStr = dataStr.substring( start + 2, end); 
    } 
    char letter = (char) Integer.parseInt( charStr, 16 ); 
    buffer.append( new Character( letter ).toString() ); 
    start = end; 
 } 
 return buffer.toString(); 
 } 
 我这样转, 转到\u5317200-300 这个位置就报错了
 我新手 没多少分请大虾们多多包含 

这是我在控制台打出的内容:
改变前===="\u5317\u4EAC\u5E02\u660C\u5E73\u533A\u4E1C\u5C0F\u53E3\u9547\u4E2D\u6EE9\u6751"
改变后====北京市昌平区东小口镇中滩村
改变前===="\u53EF\u4E58\u516C\u4EA4758\u8DEF\u3001358\u652F\u8DEF\u3001858\u8DEF\u3001849\u8DEF\u3001984\u8DEF\u3001985\u8DEF\u3001850\u8DEF\u3001426\u8DEF\u3001464\u8DEF\u3001465\u8DEF\u3001803\u8DEF\u5230\u5929\u901A\u82D1\u4E0B\u8F66\u5F80\u56DE\u8D7050\u7C73\uFF0C\u5411\u897F\u5230\u57CE\u94C1\u4E94\u53F7\u7EBF\u4E0B\u9762\u5411\u5317200-300\u7C73\u5373\u5230\uFF0C\u6216\u4E3D\u6C34\u56ED\u4E0B\u8F66\u7A7F\u8FC7\u5929\u901A\u82D1\u4E94\u533A\u5230\u57CE\u94C1\u4E94\u53F7\u7EBF\u4E0B\u9762\u5411\u5357150-250\u7C73\u5373\u5230\uFF1B\u4E58\u5730\u94C1\u4E94\u53F7\u7EBF\u5230\u5929\u901A\u82D1\u5357\u7AD9\u4E0B\u8F66\uFF0C\u51FA\u7AD9\u5F80\u5357\u8D70\u5357300-400\u7C73\u5373\u5230\uFF1B\u7531\u5317\u5411\u5357758\u8DEF\u3001358\u652F\u3001858\u8DEF\u3001849\u8DEF\u3001984\u8DEF\u3001985\u8DEF\u3001850\u8DEF\u3001426\u8DEF\u3001464\u8DEF\u3001465\u8DEF\u3001803\u8DEF\u3001\u5730\u94C1\u4E94\u53F7\u7EBF\u5230\u5929\u901A\u82D1\u5357\u7AD9\u4E0B\u8F66\u5F80\u5357\u8D70\u5357300-400\u7C73\u5373\u5230\u3002\r\n"
Exception in thread "main" java.lang.NumberFormatException: For input string: "5317200-300"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:456)
at test.TestLiantong.decodeUnicode(TestLiantong.java:352)
at test.TestLiantong.zhi(TestLiantong.java:317)
at test.TestLiantong.neirong(TestLiantong.java:254)
at test.TestLiantong.main(TestLiantong.java:52) java 转码 --------------------编程问答-------------------- 你截串的时候截错了,不应该去翻译两个\u之间的数据,而是每个\u后4位 --------------------编程问答--------------------
引用 1 楼 xodbc 的回复:
你截串的时候截错了,不应该去翻译两个\u之间的数据,而是每个\u后4位

那应该怎么改一下呢?说实话 这段反编码 我也是从网上找的 --------------------编程问答--------------------
引用 2 楼 fengziba2012 的回复:
引用 1 楼 xodbc 的回复:你截串的时候截错了,不应该去翻译两个\u之间的数据,而是每个\u后4位
那应该怎么改一下呢?说实话 这段反编码 我也是从网上找的

以这段为基础要改到靠谱需要大改,所以建议你还是再从网上找找吧,这样的代码很多的,只不过你这次找错了。 --------------------编程问答-------------------- 为什么要转啊? 直接当字符串用不行吗? --------------------编程问答--------------------

        String ss="\u53EF\u4E58\u516C\u4EA4758\u8DEF\u3001358\u652F\u8DEF\u3001858\u8DEF\u3001849\u8DEF\u3001984\u8DEF\u3001985\u8DEF\u3001850\u8DEF\u3001426\u8DEF\u3001464\u8DEF\u3001465\u8DEF\u3001803\u8DEF\u5230\u5929\u901A\u82D1\u4E0B\u8F66\u5F80\u56DE\u8D7050\u7C73\uFF0C\u5411\u897F\u5230\u57CE\u94C1\u4E94\u53F7\u7EBF\u4E0B\u9762\u5411\u5317200-300\u7C73\u5373\u5230\uFF0C\u6216\u4E3D\u6C34\u56ED\u4E0B\u8F66\u7A7F\u8FC7\u5929\u901A\u82D1\u4E94\u533A\u5230\u57CE\u94C1\u4E94\u53F7\u7EBF\u4E0B\u9762\u5411\u5357150-250\u7C73\u5373\u5230\uFF1B\u4E58\u5730\u94C1\u4E94\u53F7\u7EBF\u5230\u5929\u901A\u82D1\u5357\u7AD9\u4E0B\u8F66\uFF0C\u51FA\u7AD9\u5F80\u5357\u8D70\u5357300-400\u7C73\u5373\u5230\uFF1B\u7531\u5317\u5411\u5357758\u8DEF\u3001358\u652F\u3001858\u8DEF\u3001849\u8DEF\u3001984\u8DEF\u3001985\u8DEF\u3001850\u8DEF\u3001426\u8DEF\u3001464\u8DEF\u3001465\u8DEF\u3001803\u8DEF\u3001\u5730\u94C1\u4E94\u53F7\u7EBF\u5230\u5929\u901A\u82D1\u5357\u7AD9\u4E0B\u8F66\u5F80\u5357\u8D70\u5357300-400\u7C73\u5373\u5230\u3002\r\n";
        String sss="可乘公交758路、358支路、858路、849路、984路、985路、850路、426路、464路、465路、803路到天通苑下车往回走50米,向西到城铁五号线下面向北200-300米即到,或丽水园下车穿过天通苑五区到城铁五号线下面向南150-250米即到;乘地铁五号线到天通苑南站下车,出站往南走南300-400米即到;由北向南758路、358支、858路、849路、984路、985路、850路、426路、464路、465路、803路、地铁五号线到天通苑南站下车往南走南300-400米即到。\r\n";
        System.out.println(ss.equals(sss));//true
--------------------编程问答-------------------- 去你的java安装目录的bin目录下,有一个native2ascii.exe,双击打开黑窗口,粘贴,回车。。。万事大吉!!! --------------------编程问答-------------------- 随便写了个,不保证没BUG...
把你要解码的内容存到test.txt里面就行了
至少我试了下你这个例子是没问题的

public static void main(String[] args) throws Exception {
RandomAccessFile file = new RandomAccessFile("test.txt", "r");
FileChannel fileChannel = file.getChannel();
ByteBuffer buffer = fileChannel
.map(MapMode.READ_ONLY, 0, file.length());
CharBuffer cBuffer = Charset.defaultCharset().decode(buffer);
System.out.println("解码前:");
System.out.println(cBuffer);
CharArrayReader reader = new CharArrayReader(cBuffer.toString()
.toCharArray());
StringBuilder sb = new StringBuilder();
char previous = 0;
while (reader.ready()) {
char c = (char) reader.read();
if (previous == '\\' && c == 'u') {
byte[] data = new byte[2];
for (int i = 0; i < data.length; i++) {
data[i] = Byte.parseByte(String.valueOf((char)reader
.read()), 16);
data[i] = (byte) ((data[i] << 4 )|Byte
.parseByte(String.valueOf((char)reader.read()), 16));
}
sb.append(new String(data, "unicode"));
previous = 0;
} else {
sb.append(previous);
previous = c;
}
}
if(previous != 0)
sb.append(previous);
System.out.println("解码后:");
System.out.println(sb.toString().replaceAll("\u0000", ""));
}
--------------------编程问答-------------------- 刚想起用正则还可以调理清楚些 --------------------编程问答--------------------

public static void main(String[] args) throws Exception {
RandomAccessFile file = new RandomAccessFile("test.txt", "r");
FileChannel fileChannel = file.getChannel();
ByteBuffer buffer = fileChannel
.map(MapMode.READ_ONLY, 0, file.length());
CharBuffer cBuffer = Charset.defaultCharset().decode(buffer);
file.close();
String content = cBuffer.toString();
System.out.println("解码前:");
System.out.println(content);
Pattern pattern = Pattern.compile("\\\\u[\\da-fA-F]{4}");
Matcher matcher = pattern.matcher(content);
StringBuffer result = new StringBuffer();
while(matcher.find()){
String c = decode(matcher.group());
matcher.appendReplacement(result, String.valueOf(c));
}
matcher.appendTail(result);
System.out.println("解码后:");
System.out.println(result);
}

private static String decode(String str) throws UnsupportedEncodingException{
byte[] data = new byte[2];
data[0] = (byte) Integer.parseInt(str.substring(2, 4), 16);
data[1] = (byte) Integer.parseInt(str.substring(4, 6), 16);
return new String(data, "unicode");
}

这样是不是清楚多了 --------------------编程问答-------------------- 只要你的java文件是utf-8编码的直接输出就行了。因为java中默认就是用unicode码,你java文件的编码是u8的直接输出它就会转了

String str="\u53EF\u4E58\u516C\u4EA4758\u8DEF\u3001358\u652F\u8DEF\u3001858\u8DEF\u3001849\u8DEF\u3001984\u8DEF\u3001985\u8DEF\u3001850\u8DEF\u3001426\u8DEF\u3001464\u8DEF\u3001465\u8DEF\u3001803\u8DEF\u5230\u5929\u901A\u82D1\u4E0B\u8F66\u5F80\u56DE\u8D7050\u7C73\uFF0C\u5411\u897F\u5230\u57CE\u94C1\u4E94\u53F7\u7EBF\u4E0B\u9762\u5411\u5317200-300\u7C73\u5373\u5230\uFF0C\u6216\u4E3D\u6C34\u56ED\u4E0B\u8F66\u7A7F\u8FC7\u5929\u901A\u82D1\u4E94\u533A\u5230\u57CE\u94C1\u4E94\u53F7\u7EBF\u4E0B\u9762\u5411\u5357150-250\u7C73\u5373\u5230\uFF1B\u4E58\u5730\u94C1\u4E94\u53F7\u7EBF\u5230\u5929\u901A\u82D1\u5357\u7AD9\u4E0B\u8F66\uFF0C\u51FA\u7AD9\u5F80\u5357\u8D70\u5357300-400\u7C73\u5373\u5230\uFF1B\u7531\u5317\u5411\u5357758\u8DEF\u3001358\u652F\u3001858\u8DEF\u3001849\u8DEF\u3001984\u8DEF\u3001985\u8DEF\u3001850\u8DEF\u3001426\u8DEF\u3001464\u8DEF\u3001465\u8DEF\u3001803\u8DEF\u3001\u5730\u94C1\u4E94\u53F7\u7EBF\u5230\u5929\u901A\u82D1\u5357\u7AD9\u4E0B\u8F66\u5F80\u5357\u8D70\u5357300-400\u7C73\u5373\u5230\u3002\r\n";
System.out.println(str);
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,