Java的Unicode编码转化(多种情况处理方法)
Java转unicode转中文的情况使用的场景很多,是一个很常见的需求,按理来说,这样的功能应该被java集成起来,不过很遗憾,java提供的方法很烂,很多时候我们需要自己去写。
好在这个需求的源代码网上很多,在查资料的过程中,我找到啦好几种,下面我将我找到的资料分享和我自己实现的方法提供给大家;希望大家能有个参考;
1、java中使用的是unicode编码,所以如果我们得到的本身就是一个unicode编码,那么我们可以直接print出来的就是中文:
public static void main(String[] args){
String string= "\u9999\u714e\u9a6c\u9c9b\u9c7c\u7684\u535a\u5ba2";
System.out.println(string);
}
输出:
可是像上面那种情况在实际问题里是很少见的,在1例子中,”\”是转义字符,实际我们得到的unicode编码是这样的:
public static void main(String[] args){
String string= "\\u9999\\u714e\\u9a6c\\u9c9b\\u9c7c\\u7684\\u535a\\u5ba2";
System.out.println(string);
}
而这样得到的输出结果就变成了这样:
这样的结果肯定是我们不想要的,那么解决方法是什么呢:
方法一:这是在网上最常见的一种方法,直接将方法decodeUnicode放在类中就可以,方便,不过缺点就是代码量比较大,下面我们测试一下它的转义能力
测试项 |
例子 |
输出 |
正确结果 |
总结 |
基本能力 |
\u9999\u714e\u9c7c |
香煎鱼 |
香煎鱼 |
正确 |
中英文数字混合 |
1\u9999123\u714ehi\u9c7ca |
1香123煎hi鱼a |
1香123煎hi鱼a |
正确 |
中英文,特殊字符混合 |
\u9999\u\u714e\u9c7c |
(错误) |
香\u煎鱼 |
无法正常运行 |
\u9999\\u714e\u9c7c |
香\u714e鱼 |
香\煎鱼 |
转义有误 |
可见,方法一虽然能对中英混合进行识别,但对\和\u的识别仍然存在问题,我们可以给他打70分;
public static String decodeUnicode(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();
}
}
方法二:此种方法在网上也比较常见,代码量少,可读性强是它最大的优点,但是,它的转义能力……大家自己体会一下吧;
测试项 |
例子 |
输出 |
正确结果 |
总结 |
基本能力 |
\u9999\u714e\u9c7c |
香煎鱼 |
香煎鱼 |
正确 |
中英文数字混合 |
1\u9999123\u714ehi\u9c7ca |
(错误) |
1香123煎hi鱼a |
无法正常运行 |
中英文,特殊字符混合 |
\u9999\u\u714e\u9c7c |
(错误) |
香\u煎鱼 |
无法正常运行 |
\u9999\\u714e\u9c7c |
(错误) |
香\煎鱼 |
无法正常运行 |
它的转义能力决定它的实用性不强,但是鉴于它比较简单,所以还是有一定市场的,不过也请大家谨慎使用,根据我的测试,这种转码方式只对全中文有效
public static String ascii2native_orl(String ascii) {
int n = ascii.length() / 6;
StringBuilder sb = new StringBuilder(n);
for (int i = 0, j = 2; i < n; i++, j += 6) {
String code = ascii.substring(j, j + 4);
char ch = (char) Integer.parseInt(code, 16);
sb.append(ch);
}
return sb.toString();
}
方法三:既然方法二有问题,那么我们能不能对他进行一些改进,让它适应性更强呢,当然,如果方法二加上正则表达式,就有更强的功能了
测试项 |
例子 |
输出 |
正确结果 |
总结 |
基本能力 |
\u9999\u714e\u9c7c |
香煎鱼 |
香煎鱼 |
正确 |
中英文数字混合 |
1\u9999123\u714ehi\u9c7ca |
1香123煎hi鱼a |
1香123煎hi鱼a |
正确 |
中英文,特殊字符混合 |
\u9999\u\u714e\u9c7c |
香\u煎鱼 |
香\u煎鱼 |
正确 |
\u9999\\u714e\u9c7c |
香\煎鱼 |
香\煎鱼 |
正确 |
这种方法很好利用了正则表达式,代码可读性强,转义能力也很不错,强烈推荐
public static String ascii2native(String ascii) {
List<String> ascii_s = new ArrayList<String>();
String zhengz= "\\\\u[0-9,a-f,A-F]{4}";
Pattern p = Pattern.compile(zhengz);
Matcher m=p.matcher(ascii);
while (m.find()){
ascii_s.add(m.group());
}
for (int i = 0, j = 2; i < ascii_s.size(); i++) {
String code = ascii_s.get(i).substring(j, j + 4);
char ch = (char) Integer.parseInt(code, 16);
ascii = ascii.replace(ascii_s.get(i),String.valueOf(ch));
}
return ascii;
}
总结:其实,三种方法的基本思想都是一样的,但是最大的区别就是在怎么短句,短句的方法不同,解析能力也不同。
<!--EndFragment-->
相关推荐
Notepad++(UNICODE)简体中文
java中unicode编码工具类,可直接使用,内含将字符串转化为unicode编码,unicode码转化成字符串,将中文转化成unicode,将每个\前面加上%进行模糊查询方法
各种字符集编码表,包括iso-8859-1,gbk,gb18030, unicode,以及字符集的转换说明(主要是Java国际化的一些字符集转化说明)
JDK11 是 Java 的下一个生产版本,跟踪 Unicode 10.0.0。 较新标准的缺点是它们包含更多的代码点,这会转化为更多的数据和更大的二进制大小。 这对下面的目标#4不利,但添加了字体和表情符号。 本项目的总体目标...
随着计算机的发展,为了适应世界其它民族的语言(当然包括我们的汉字),人们提出了UNICODE编码,它采用双字节编码,兼容英文字符和其它民族的双字节字符编码,所以,目前,大多数国际性的软件内部均采用UNICODE编码...
代码如下:var GB2312UnicodeConverter = { ToUnicode: function (str) { return escape(str).toLocaleLowerCase().replace(/%u/gi, ‘\\u’); } , ToGB2312: function (str) { return unescape(str.replace(/\\...
51.Object类(或者其子类)的finalize()方法在什么情况下被调用? 52.一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握内部类和接口的概念 54.StringTokenizer类的使用 55.数据结构,如何遍历...
public String sendAT(String atcommand) throws java.rmi.RemoteException { String s = ""; try { Thread.sleep(100); writeln(atcommand); Thread.sleep(80); s = read(); Thread.sleep(100); } catch ...
Java Swing GUI桌面应用工具,集成常用的开发调试工具。 如: ...2、Unix时间戳,获取最新时间,Unix时间戳转化为通用时间字符串格式 3、字符串长度计算 4、Url编码 解码 5、Base64 加密 解密 6、Unicode 编码 解码
Notepad2是一个外观类似系统记事本的...2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标
� Google 提供了一套 Java 核心包 (J2SE 5,J2SE 6) 的有限子集,尚不承诺遵守 Java 任何 Java 规范 , 可能会造 成J ava 阵营的进一步分裂。 � 现有应用完善度不太够,需要的开发工作量较大。--------------------...
面向对象的思想方法已经非常流行了,在编程语言(例如java,js)中,都运用面向对象的编程思想。在XML中,就是要将网页也作为一个对象来操作和控制,我们可以建立自己的对象和模板。与对象进行交流,如何命令对象,...
对中文/汉字的特殊处理是由.Net提供的正则表达式引擎支持的,其它环境下的具体情况请查看相关文档。 下面来看看更多的例子: \ba\w*\b匹配以字母a开头的单词——先是某个单词开始处(\b),然后是字母a,然后是任意数量...
JAVA模版引擎Freemarker常用标签(一) 1. if指令 这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: <#if condition>... <#elseif condition>... <#elseif condition>......