import java.io.IOException;
/**
* UTF-16BE: 16 位 UCS 转换格式,Big Endian(最低地址存放高位字节,符合人们的阅读习惯)字节顺序
* UTF-16LE: 16 位 UCS 转换格式,Little-endian(最高地址存放高位字节)字节顺序
* UTF-16: 16 位 UCS 转换格式,字节顺序(是高字节在前还是低字节在前)由流中的前两字节中字节顺序标记来确定
*
* UTF-16BE: FE FF 字节顺序标记
* UTF-16LE: FF FE 字节顺序标记
*/
public class Test {
public static void main(String[] args) throws IOException {
String str = "中";
//------------编码
//Java里使用的是UTF-16BE方式来存储数据的
System.out.println(Integer.toHexString(str.charAt(0) & 0x00FFFF | 0xFF0000).substring(2, 6)
.toUpperCase());//4E2D
/*
* 进行编码时,因为 UTF-16 编码方式本身未指定字节顺序标记,所以默认使用 Big Endian 字节
* 顺序编码,并将 Big Endian 字节顺序标记写入到流中,所以流前面多了 FE FF 二字节的高字节
* 顺序标记
*/
System.out.println(byteToHex(str.getBytes("utf-16")));//FE FF 4E 2D
/*
* 进行编码时,UTF-16BE 和 UTF-16LE charset 不会将字节顺序标记写入到流中
* 即它们所编出的码每个字符只占二个字节,要注意的是解码时要使用同样的编码
* 方式,不然会出现问题乱码
*/
System.out.println(byteToHex(str.getBytes("utf-16BE")));//4E 2D
System.out.println(byteToHex(str.getBytes("utf-16LE")));//2D 4E
//使用 utf-16BE 对高字节序进行解码,忽略字节顺序标记,即不会将流前二字节内容看作字节序标记
System.out.println(new String(new byte[]{0x4E,0x2D},"utf-16BE"));// 中
//使用 utf-16LE 对低字节序进行解码,忽略字节顺序标记,即不会将流前二字节内容看作字节序标记
System.out.println(new String(new byte[]{0x2D,0x4E},"utf-16LE"));// 中
//------------解码
/*
* 使用 utf-16 进行解码时,会根据流前两字节内部来确定是低还是高字节顺序,如果流的前两字节
* 内部不是 高字节序 FE FF,也不是低字节序 FF FE时,则默认使用 高字节序 方式来解码
*/
//因为0x4E,0x2D为“中”字的高字节表示,所以前面需要加上 FE FF 字节顺序标记来指示它
System.out.println(new String(new byte[]{(byte) 0xFE,(byte) 0xFF,0x4E,0x2D},"utf-16"));//中
//因为0x2D,0x4E为“中”字的低字节表示,所以前面需要加上 FF FE 字节顺序标记来指示它
System.out.println(new String(new byte[]{(byte) 0xFF,(byte) 0xFE,0x2D,0x4E,},"utf-16"));//中
//使用默认 高字节顺序 方式来解码,
System.out.println(new String(new byte[]{0x4E,0x2D},"utf-16"));//中
//因为 0x2D,0x4E 为“中”的低字节序,但 utf-16 默认却是以 高字节序来解的,所以出现乱码
System.out.println(new String(new byte[]{0x2D,0x4E,},"utf-16"));//?
}
public static String byteToHex(byte[] bt) {
StringBuilder sb = new StringBuilder(4);
for (int b : bt) {
sb.append(Integer.toHexString(b & 0x00FF | 0xFF00).substring(2, 4)
.toUpperCase());
sb.append(" ");
}
return sb.toString();
}
}
注,只有UTF-16,即只有使用Unicode编码存储或传递时,才涉及到高字节还是低字节序的问题,UTF-8一般是没有字节序的概念的,因为utf-8编码本身中就已含有了编解码转换方式了。
另外请参考《ByteBuffer转CharBuffer时编码方式问题》、《文件的字节顺序记号》
分享到:
相关推荐
最近需要对Linux与Windows平台下的字符传输出现乱码,对...参考了网上的UTF-8/UTF-16转换的资料,只有0x10000以下的Unicode编码进行了转换;对其代码进行了修改和补充,可以实现所有的UTF-8/UTF-16的转换,分享给大家。
CodeDetectorDetect File encoding, Now support UTF-8,GBK,UTF-16LE,UTF-16BE, Java检查文件编码,主要针对中文文本。目前支持 UTF-8(BOM或无BOM)、GBK、UTF-16LE、UTF-16BE单个文件或文件夹,支持编码批量转换。...
例如,txt文件由UTF-16LE转为UTF-8…… 问题重现:往往利用python处理数据时,都会遇到文件编码格式不对,那么如何批量转换呢,下面直接上代码! 实例:整个文件夹的txt文件由UTF-16LE转为UTF-8 # coding utf-8 ...
以UTF=16LE编码方式保存或读取文件,可以结合博客“c++ 以UTF-16LE编码方式保存文件”查看辅助理解
change file encoding in batches, now support UTF-8,GBK,UTF-16LE,UTF-16BE, Java java -Dfile.encoding=utf-8 -mx1000m -jar ChangeEncoding-1.0.jar inputPath outPath in_encoding out_encoding in_encoding 是...
UTF-16BE UTF16LE UTF-16LE UTF32 UTF-32 UTF32BE UTF-32BE UTF32LE UTF-32LE UCS2 UCS-2 UCS-2LE UCS-2BE UCS-2-INTERNAL UCS4 UCS-4 UCS-4LE UCS-4BE UCS-4-INTERNAL SDL_iconv.c是一部分。 ...
pb12 gb转utf-8
主要介绍了Java避免UTF-8的csv文件打开中文出现乱码的方法,结合实例形式分析了java操作csv文件时使用utf-16le编码与utf8编码相关操作技巧,需要的朋友可以参考下
读取ANSI 明码文件 读取Unicode 明码文件 读取Unicode big endian 明码文件 读取UTF-8 明码文件 读取UTF8 Bom 明码文件 读取UTF16-LE 明码文件 读取UTF16-BE 明码文件 到多字节字符串 扩展类CFilePlainCode
处理UTF-8,UTF-16BE,UTF-16LE; (可选)将DOS或Windows代码页或HP-Roman8中的常用字符转换为ISO-8859-1。 UCS字符可以映射到8位转换字符串。 单个ISO C源文件“ 8conv.c”。 可以通过配置文件控制翻译,示例文件...
一个LRC(标准歌词)、TRC(天天动听歌词)、KRC(酷狗音乐歌词)之间相互转换的工具,自动识别ANSI、UTF-8-BOM、UTF-8-NOBOM、UTF-16LE-BOM、UTF16BE-BOM编码,同时可保存为ANSI、UTF-8-BOM、UTF-8-NOBOM、UTF-16LE...
功能介绍 在文本字元编码之间进行转换(包括UTF-8,没有bom标记的UTF-8,UTF-16le,UTF-16be,UTF-32le,UTF-32be,中文简体GBK,中文繁体BIG5,日文 shift-JIS, 日文 euc-jp, 韩文 euc-kr等, 请参照支援的
基于C写的 UTF8-无BOM转为UTF16LE UTF8-无BOM转为UTF8 UTF8转为UTF8-无BOM
文件编码批量转换工具可以将GBK、UTF-8、US-ASCII、ISO-8859-1、GB2312、UTF-16、UTF-16BE、UTF-16LE等编码格式的文件互相转换成你需要的文件。
本源码是我写的一个小工具,用于斯凯平台开发 功能:汉字转16进制编码(unicode bigend)
编码转换可转utf-8等..............
用于探查文本类文件的...5)UTF-16BE',这是文件中带有UTF-16BE前导标志的大端UNIcode编码 6)UTF-8BOM'这是文件中带有BOM前导标志的UTF8编码 软件运行时,可以将目录粘贴到第一栏中,最下边一栏显示文件的编码格式
总是遇到文件编码不一致的情况,自己抽...支持gb2312、gbk(ansi)、gb18030、utf-8、utf-8bom、utf-16le、utf-16be 自动识别文本文件后缀名、原始编码格式,根据用户设定的目标编码智能转换 其他详细说明见软件内说明。
"UTF-16BE" "UTF-16LE" "UTF-32" "UTF-32BE" "UTF-32LE" "Windows-1250" "Windows-1251" "Windows-1252" "Windows-1253" "Windows-1254" "Windows-1255" "Windows-1256" "Windows-1257" "Windows-1258"。
如果在 -z<文件> 开关中指定的注释文件的编码未使用 -sc 开关定义,则 RAR会根据字节顺序掩码和数据有效性测试尝试检测 UTF-8,UTF-16LE 和 UTF-16BE编码。 &. WinRAR 会自动检测 ZIP 压缩文件注释的 ANSI,OEM 和 ...