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时编码方式问题》、《文件的字节顺序记号》
分享到:
相关推荐
在编程领域,尤其是在涉及到字符编码的时候,理解和操作UTF-8和UTF-16之间的转换是一项基本技能。UTF-8和UTF-16是两种广泛使用的Unicode编码格式,它们各自有其特性和应用场景。本文将深入探讨如何利用C++来实现这两...
最近需要对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单个文件或文件夹,支持编码批量转换。...
以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-8和UTF-16LE这两种编码格式。UTF-8是一种变长编码格式,使用1到4个字节来表示一个字符。UTF-16LE是一种定长编码格式,每个字符使用2个字节来表示。Excel 2007以上版本可以识别UTF-16LE编码格式的...
文档提到了MIME字符集命名,并包含了三个MIME字符集参数值的注册:UTF-16BE(大端序)、UTF-16LE(小端序)和UTF-16。 根据互联网工程任务组(IETF)关于字符集和语言的政策[CHARPOLICY],IETF协议必须能够使用UTF-...
UTF-8是一种多字节的Unicode编码方式,可以表示世界上几乎所有的字符,包括各种语言的字符。它是互联网上最常用的字符编码格式,因为它兼容ASCII,并且在处理多种语言时具有良好的通用性。 转换“pb12 gb转utf-8”...
Qt打开文本时自动检测文件编码并正确解析文件,通过检测文件头标志判断UTF-8、UTF-16LE/BE、GBK等格式,确保文本数据的正确读取。 自己定义个Skysonya类,可以检测文件编码格式,同时定义了文件打开和保存函数,附带...
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是一部分。 ...
本主题主要关注UTF8和UTF16LE两种不同的字符编码格式之间的转换,特别是如何进行无BOM(字节顺序标记)的处理。下面我们将深入探讨这两种编码方式以及它们在实际应用中的转换。 首先,UTF8是一种广泛使用的变长...
我们将以一个具体的例子来说明,即如何将TXT文件从UTF-16LE编码转换为UTF-8编码。 首先,我们要导入必要的库。`os`库用于操作文件和目录,而`chardet`库则用于检测文件的编码类型。以下是一个简单的Python脚本,...
首先,我们需要检查数据是否以UTF16LE(小端序)或UTF16BE(大端序)编码。大多数现代系统使用UTF16LE,但最好能适应两者。 3. **转换为UTF16字符串**: Delphi中的`AnsiString`、`WideString`和`UnicodeString`...
读取ANSI 明码文件 读取Unicode 明码文件 读取Unicode big endian 明码文件 读取UTF-8 明码文件 读取UTF8 Bom 明码文件 读取UTF16-LE 明码文件 读取UTF16-BE 明码文件 到多字节字符串 扩展类CFilePlainCode
Unicode编码通常有多种实现方式,例如UTF-8、UTF-16和UTF-32。Unicode的目的是消除过去不同编码系统导致的乱码问题,使得不同系统和程序间可以无缝交换文本。 **Utf8ToUnicode工具** `Utf8ToUnicode.exe` 是一个...
请注意,实际的编码转换过程需要考虑到字节顺序标记(BOM),因为UTF-16有LE(小端)和BE(大端)两种字节顺序。 在处理这些编码转换时,需要注意字符编码的正确性和一致性,避免乱码问题。同时,由于不同的系统和...
Unicode编码有多种表示方式,如UTF-8、UTF-16等。其中,UTF-16使用2个或4个字节来表示一个字符,对于汉字,通常都是两个字节。而在UTF-16的编码中,又分为大端序(Big-Endian)和小端序(Little-Endian)。大端序是...
处理UTF-8,UTF-16BE,UTF-16LE; (可选)将DOS或Windows代码页或HP-Roman8中的常用字符转换为ISO-8859-1。 UCS字符可以映射到8位转换字符串。 单个ISO C源文件“ 8conv.c”。 可以通过配置文件控制翻译,示例文件...
其中,"Ansi2Unicode"可能是一个专门用于此目的的工具,它可以将ANSI编码的文件转换为Unicode,而Unicode在Windows中通常会被识别为UTF-16LE,但通常在提到将ANSI转为UTF-8时,这个工具可能是实现了类似功能。...
在Windows系统中,记事本默认使用的就是UNICODE的Little-Endian形式,通常表示为UTF-16LE。 再者,UTF-8编码是目前互联网上最常用的Unicode实现方式,它使用1到4个字节来表示一个字符,对于英文字符只用1个字节,而...