昨天在公司听见同事在询问中文与asicii码如何转换?我当时就很差异,asicii码怎么可能表示中文啊?!原来是要将形如\uXXXX(X表示一16进制数,非X)的码与中文转换。好吧,我刚知道“这竟然被叫成asicii码”!
于是现在网上找了一下资料,对参考的代码进行了一些优化,如StringBuffer的使用和正则表达式验证合法性。
通过思考,已经能理解Unicode向字符的转换,对相反的转换的原理基本理解,还需要查查原理。
基本理论:
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。目前6.0版本已经发布。Unicode定义了大到足以代表人类所有可读字符的字符集。Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。
Unicode的实现方式有UTF-8、UTF-16、UTF-32。
UTF-8以字节为单位对Unicode进行编码,对不同范围的字符使用不同长度的编码。
UTF-16编码以16位无符号整数为单位。
UTF-32编码以32位无符号整数为单位。Unicode的UTF-32编码就是其对应的32位无符号整数。
形如\u1234的unicode应是采取utf-16的实现方式,所以以下encode方法中先将字符用utf-16方式表示,将每8bit放入byte中,然后将byte转为16进制表示,4个16进制符号就表示一个字符的unicode编码了。
其中与0xff的与运算和删除符号表示两个步骤都是必须的。
1,不进行0xff与,然后输出bytesUtf16[n],感觉诧异,byte不就8bit吗,怎么存输出2+个16位符号?后两个符号是需要的,所以有了&操作。后来理解,因为符号引起的前方补位。-的前补1,16制后前全为f,+补0,16制后仍是byte的16制。所以这里需要与0xff,致使只剩下后8位。也就是编码需要的。
2,Unicode标准建议用BOM(Byte Order Mark)来区分字节序,即在传输字节流前,先传输被作为BOM的字符"零宽无中断空格"。这个字符的编码是FEFF,而反过来的FFFE(UTF-16)和FFFE0000(UTF-32)在Unicode中都是未定义的码位,不应该出现在实际传输中,所以又删除符号操作。
//将字符转为unicode
public static String encode(String str) {
if (null == str || str.equals(""))
return "输入字符";
StringBuffer sb = new StringBuffer();
try {
//用16bit数字编码表示一个字符,每8bit用byte表示。
byte bytesUtf16[] = str.getBytes("UTF-16");
for (int n = 0; n < bytesUtf16.length; n++) {
// 截取后面8位,并用16进制表示。
str = (java.lang.Integer.toHexString(bytesUtf16[n] & 0XFF));
// 将获得的16进制表示连成串
sb.append((str.length() == 1) ? ("0" + str) : str);
}
// 去除第一个标记字符
str = sb.toString().toUpperCase().substring(4);
char[] chs = str.toCharArray();
str = "";
for (int i = 0; i < chs.length; i = i + 4) {
str += "\\u" + chs[i] + chs[i+1] + chs[i+2] + chs[i+3];
}
} catch (Exception e) {
System.out.print(e.getMessage());
str = "程序出现异常";
} finally {
return str;
}
}
//將unicode转为字符
public static String decode(final String str) {
if(null == str || str.equals("")){
return "輸入unicode";
}
//用正则表达式验证
Pattern p = Pattern.compile("(\\\\u[0-9a-fA-F]{4})+");
Matcher m = p.matcher(str);
if(!(m.find() && m.group().equals(str))){
return "非法格式";
}
String[] strs = str.split("u");
StringBuffer sb = new StringBuffer();
for (int i = 1; i <= strs.length - 1; i++) {
sb.append(new Character((char) Integer.parseInt(strs[i].replace("\\", ""), 16)));
}
return sb.toString();
}
分享到:
相关推荐
此函数实现由ANSI字符串与Unicode字符串的相互转换,不要错过哦!
可以将ANSI和UNICODE字符串转换成16进制数据,也可以将16进制数据转换成ANSI和UNICODE字符串,UNICODE字符串还可以选择高位在前还是低位在前,非常的好用。
字符编码转换 字符串到Unicode的转换等 字符高低位转换等。
将字符串或段落文章转换为Unicode,或将Unicode转换为字符串,支持密钥。
适用于需要字符串转化成Unicode代码的地方、譬如触摸屏、LCD、单片机、串口通信。
C#字串与Unicode互相转换方法C#字串与Unicode互相转换方法C#字串与Unicode互相转换方法
UnicodeCode编码转换成字符串编码的C#类 \uA054\uA055 => "中文
C#字符串与unicode互相转换实战案例 c#经典案例.pdf
字符串与数字、unicode与ansic之间的转换,单字双字、标准库string和CString转换等等转换关系
vs2008下Unicode字符串和ANSI 字符串的相互转换 一直都很不习惯vs2008下的编程,是因为其对字符串的用法不像VC6那样方便了,其实这也增加了对字符串的安全检查, 这里我花了一下午的时间研究,终于搞懂了Unicode字符...
utf8字符串与unicode的相互转换。 在utf8编码的网页上输入字符串后, 可产生unicode编码字符串, 然后再还原回原先的utf8字符串。html/PHP实现。
运行环境Java JDK 5.0 Unicode字符转换为中文字符,中文字符转Unicode字符 Unicode字符只支持以\u####格式 <br>MS有人在找这东西,自己也找过,没找着就自己做了一个,功能简单只满足自己的需求:) pp
本文实例讲述了JavaScript中字符串与Unicode编码互相转换的实现方法。分享给大家供大家参考,具体如下: 这段代码演示了JavaScript中字符串与Unicode编码的转换: // 为了控制台的演示方便, 变量没有添加 var 定义 /...
本文主要介绍Unicode与ANSI字符串之间的转换的关键代码
在以前用VC++ 编写程序的时候,没有注意以后采用Unicode字符集,程序中出现的大量字符串需要添加 _T()才能正常编译,这是一个很庞大的工作,因此自己写了一个工具来实现自动转换,在使用时请您首先备份自己的代码...
本文主要介绍了js字符串与Unicode编码互相转换的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧
Ansi、Unicode、UTF8字符串之间的转换,wprintf
软件介绍: 字符串转换器可以进行10进制转2进制转换,10进制转8进制/16进制转换。16进制转2进制或8进制10...字符串转10进制16进制,字符串转Unicode或Delphi DFM字符串。转换前选择一下要使用的转换模式转换即可。
1.字符串Asc&Unicode和Hex之间的转换 2.可以格式化显示输出这个功能类似printf,但是是一个指定字节大小为单位的'值'来进行输出的。 3.可以通过Hex输入查看原字符串 4.字符统计功能 5.输入的字符串Asc&Unicode或者...
使用C++实现字符与UNICODE十六进制字符串之间的互转;字符包括汉字,英文,数字等。需要的朋友可以下载。 使用C++实现字符与UNICODE十六进制字符串之间的互转;字符包括汉字,英文,数字等。需要的朋友可以下载。