上面的文章已经说过UTF-16的来历,但是所有的Unicode都有一个区分,那就是有签名和无签名之分,何为签名呢,就是文件编辑器在Unicode文件的开头字节中自动加入的识别字符。
现在来看看UTF-16的区别,UTF-16有两种编码:UTF-16LE和UTF-16BE,这两种编码有分别分为有签名和无签名,要正确读取解析这中文件就要用字符集一一对应,目前在JAVA中的对应方式如下:
Unicode:UTF-16LE有签名
UTF-16LE:UTF-16LE无签名
UTF-16BE:UTF-16BE无签名
UTF-16:UTF-16BE有签名
如何识别这四种编码方式,请看以下代码:
**
* 判断文件的编码格式
* @author luoyifan
* @date 2010-03-22
*/
private String getCharset(String filename){
String charset = "GBK";//设置默认为ANSI
byte[] first3Bytes = new byte[3];
try {
boolean checked = false;
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filename));
bis.mark(0);
int read = bis.read(first3Bytes,0,3);
if (read == -1 ) return charset;
if (first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte)0xFE) {
charset = "UTF-16LE-sign"; //UTF-16LE有签名
checked = true;
}
else if (first3Bytes[0] == (byte)0xFE && first3Bytes[1] == (byte)0xFF) {
charset = "UTF-16BE-sign"; //UTF-16BE有签名
checked = true;
}
else if(first3Bytes[0] == (byte)0x22 && first3Bytes[1] == (byte)0x00){
charset = "UTF-16LE-unsign";//UTF-16LE无签名
checked = true;
}
else if(first3Bytes[0] == (byte)0x00 && first3Bytes[1] == (byte)0x22){
charset = "UTF-16BE-unsign";//UTF-16BE无签名
checked = true;
}
else if (first3Bytes[0] == (byte)0xEF && first3Bytes[1] == (byte)0xBB && first3Bytes[2] == (byte)0xBF ) {
charset = "UTF-8";
checked = true;
}
bis.reset();
if (!checked){
int loc = 0;
while ((read = bis.read()) != -1) {
loc++;
if (read >= 0xF0) break;
if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的,也算是GBK
break;
if (0xC0 <= read && read <= 0xDF) {
read = bis.read();
if (0x80 <= read && read <= 0xBF) //双字节 (0xC0 - 0xDF) (0x80
// - 0xBF),也可能在GB编码内
continue;
else break;
}
else if (0xE0 <= read && read <= 0xEF) {//也有可能出错,但是几率较小
read = bis.read();
if (0x80 <= read && read <= 0xBF) {
read = bis.read();
if (0x80 <= read && read <= 0xBF) {
charset = "UTF-8";
break;
}
else break;
}
else break;
}
}
//System.out.println( loc + " " + Integer.toHexString( read ) );
}
bis.close();
} catch ( Exception e ) {
e.printStackTrace();
}
return charset;
}
上面的代码是总结的开头字节,UTF-16LE有签名对应着[-1,-2],UTF-16BE有签名对应着[-2,-1],UTF-16LE无签名对应着[34,0],UTF-16BE无签名对应着[0,34]。
目前在系统中创建的UTF-16文件都是按如上的开头字节对应的,但是也有例外的情况,当从UTF-8的文件转换为UTF-16的无签名文件就无签名就会转变为[70,85]和[85,70]这个地方是不定的,随文件的不同而不同
分享到:
相关推荐
UTF-16汉字编码表,txt格式的
最近需要对Linux与Windows平台下的字符传输出现乱码,对...参考了网上的UTF-8/UTF-16转换的资料,只有0x10000以下的Unicode编码进行了转换;对其代码进行了修改和补充,可以实现所有的UTF-8/UTF-16的转换,分享给大家。
UTF-7,编码解码工具,可直接用于跨站脚本攻击xss
GBK、UTF-8批量文件3秒快速转码工具(支持GBK,UTF-8免费转换),UTF-8/GBK编码在线转换工具,压缩包可以有多目录与文件,如目录中有图片不会转码,但是会随转码好的文件一起打包下载。 使用帮助 . 上传压缩包(仅支持zip...
最近的项目(Delphi开发),需要经常和java语言开发的系统进行数据交互(Socket通信方式),数据编码约定采用UTF-8编码。 令我无语的是:JAVA系统那边反映说,Delphi发的数据他们收到是乱码,而我这边(Delphi7,...
宽字节和多字节转换,利用C++实现UTF-8和UTF-16之间的转换,包括错误处理
包含GBK和UTF16字符集的对照表,用于将GBK字节流和UTF字符串之间的互相转换。
如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节,而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。用4个或6个字节去编码一个UNICODE字符可能太多了,但很少会遇到那样的UNICODE...
为大家提供Python的UTF-8编码查询表,大家可以对照左列的编码查询右列的汉字。 例:\u4e00对应汉字“一”
文件里有详细的代码,编码格式选择UTF-8编码,亲测在linux下可以直接运行。泰文在osd输出的流程一般是泰文先转换成Unicode编码,然后调用freetype进行文字渲染叠加
有61726个字符,csv格式,做编码的基础数据 0000, 0001,Ā 0002,Ȁ 0003,̀ 0004,Ѐ 0005,Ԁ 0006, 0007,܀ 0008,ࠀ 0009,ऀ 000C,ఀ 000D,ഀ 000F,ༀ 0010,က 0011,ᄀ 0012,ሀ
请使用这款软件,直接将代码转换为UTF-8 注意: 1、xml不需要转换,因为xml默认是utf-8,在你新建的时候已经是正确的格式了 2、图片更不需要转换 3、bin目录,gen目录的直接忽略 4.只需要src目录的代码转换,请确保...
iOS 显示汉字的Unicode和UTF-8编码
PowerBuilder9.0开发环境下,可以把UTF-8的编码转换为Unicode的编码格式,在pb9.0环境下测试通过。
可以将文字转换为UTF-8编码的一个小工具,非常实用。
Unicode字符的UTF-8、UTF-16、UTF-32编码方式[总结].pdf
此文本文档是UTF-8字符集中汉字编码对照表,可以用于查看某个汉字在UTF-8编码集中的位置。此编码集对照表非官网下载,如需使用,请提前预估风险。另外,此对照表只用于学习研究,如需用到其他地方,后果自负。
百度编辑器 asp版 UTF-8编码;通过本人亲自己测试修改。
Unicode转UTF-8
可以实现编码转换,使用编码utf-8转换成gbk