UTF-16、UTF-16BE、UTF-16LE编码方式的区别

文章分类:Java编程

Java代码
  1. import  java.io.IOException;
  2. /**
  3. * UTF-16BE: 16 位 UCS 转换格式,Big Endian(最低地址存放高位字节,符合人们的阅读习惯)字节顺序
  4. * UTF-16LE: 16 位 UCS 转换格式,Little-endian(最高地址存放高位字节)字节顺序
  5. * UTF-16: 16 位 UCS 转换格式,字节顺序(是高字节在前还是低字节在前)由流中的前两字节中字节顺序标记来确定
  6. *
  7. * UTF-16BE: FE FF 字节顺序标记
  8. * UTF-16LE: FF FE 字节顺序标记
  9. */
  10. public   class  Test {
  11. public   static   void  main(String[] args)  throws  IOException {
  12. String str = "中" ;
  13. //------------编码
  14. //Java里使用的是UTF-16BE方式来存储数据的
  15. System.out.println(Integer.toHexString(str.charAt(0 ) &  0x00FFFF  |  0xFF0000 ).substring( 2 ,  6 )
  16. .toUpperCase());//4E2D
  17. /*
  18. * 进行编码时,因为 UTF-16 编码方式本身未指定字节顺序标记,所以默认使用 Big Endian 字节
  19. * 顺序编码,并将 Big Endian 字节顺序标记写入到流中,所以流前面多了 FE FF 二字节的高字节
  20. * 顺序标记
  21. */
  22. System.out.println(byteToHex(str.getBytes("utf-16" ))); //FE FF 4E 2D
  23. /*
  24. * 进行编码时,UTF-16BE 和 UTF-16LE charset 不会将字节顺序标记写入到流中
  25. * 即它们所编出的码每个字符只占二个字节,要注意的是解码时要使用同样的编码
  26. * 方式,不然会出现问题乱码
  27. */
  28. System.out.println(byteToHex(str.getBytes("utf-16BE" ))); //4E 2D
  29. System.out.println(byteToHex(str.getBytes("utf-16LE" ))); //2D 4E
  30. //使用 utf-16BE 对高字节序进行解码,忽略字节顺序标记,即不会将流前二字节内容看作字节序标记
  31. System.out.println(new  String( new   byte []{ 0x4E , 0x2D }, "utf-16BE" )); // 中
  32. //使用 utf-16LE 对低字节序进行解码,忽略字节顺序标记,即不会将流前二字节内容看作字节序标记
  33. System.out.println(new  String( new   byte []{ 0x2D , 0x4E }, "utf-16LE" )); // 中
  34. //------------解码
  35. /*
  36. * 使用 utf-16 进行解码时,会根据流前两字节内部来确定是低还是高字节顺序,如果流的前两字节
  37. * 内部不是 高字节序 FE FF,也不是低字节序 FF FE时,则默认使用 高字节序 方式来解码
  38. */
  39. //因为0x4E,0x2D为“中”字的高字节表示,所以前面需要加上 FE FF 字节顺序标记来指示它
  40. System.out.println(new  String( new   byte []{( byte )  0xFE ,( byte )  0xFF , 0x4E , 0x2D }, "utf-16" )); //中
  41. //因为0x2D,0x4E为“中”字的低字节表示,所以前面需要加上 FF FE 字节顺序标记来指示它
  42. System.out.println(new  String( new   byte []{( byte )  0xFF ,( byte )  0xFE , 0x2D , 0x4E ,}, "utf-16" )); //中
  43. //使用默认 高字节顺序 方式来解码,
  44. System.out.println(new  String( new   byte []{ 0x4E , 0x2D }, "utf-16" )); //中
  45. //因为 0x2D,0x4E 为“中”的低字节序,但 utf-16 默认却是以 高字节序来解的,所以出现乱码
  46. System.out.println(new  String( new   byte []{ 0x2D , 0x4E ,}, "utf-16" )); //?
  47. }
  48. public   static  String byteToHex( byte [] bt) {
  49. StringBuilder sb = new  StringBuilder( 4 );
  50. for  ( int  b : bt) {
  51. sb.append(Integer.toHexString(b & 0x00FF  |  0xFF00 ).substring( 2 ,  4 )
  52. .toUpperCase());
  53. sb.append(" " );
  54. }
  55. return  sb.toString();
  56. }
  57. }
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编码本身中就已含有了编解码转换方式了。

UTF-16、UTF-16BE、UTF-16LE编码方式的区别相关推荐

  1. python2字符串编码方式_编码方式的区别以及文本在python2中的应用

    背景: 文本以及字符串处理在网络应用中随处可见,面对不同的用户接口调用方,以及不同的我们需要调用的接口,可能都会有不一样的编码规范. 而我在以前的开发中,对于字符串的处理经常会是以猜的方式来处理,en ...

  2. 视频文件格式和视频编码方式的区别

    原文地址:https://wenku.baidu.com/view/b2ebd7e44afe04a1b071deaa.html 目前网上的各种视频格式可以说是泛滥成灾,加上各个PMP(Portable ...

  3. USB3.0与USB2.0编码方式的区别

    首先,USB3.0传输的编码方式和USB2.0本质上是不同的. 1.USB3.0的编码方式 USB 3.0采用的是8b/10b编码方式,由于高速传输,信号干扰的问题,USB 3.0采用 8/10bit ...

  4. C#常见编码方式总结

    一.概念 我们知道计算机是基于二进制来表示数据的,那么对于字母和汉字等字符用二进制如何表示? 这就需要用一种编码方式将这些字母或者符号转换二进制表示.首先需要对字符集进行编码表示,每个编码代表一个固定 ...

  5. 【转】刨根究底字符编码之十五——UTF-32编码方式

    1. UTF-32在UTF目前常用的三种编码方式(UTF-8.UTF-16.UTF-32)中,是最为简单的一种编码方式.UTF-32编码方式不使用任何编码算法将Unicode字符码点值(即编号字符集C ...

  6. Unicode、UTF 和 ISO-8859-1等编码方式详解与浏览器URL编码

    将字符转换为二进制码的过程,我们称为编码,将二进制码转换为字符的过程,我们称为解码. 编码和解码时所采用的规则,我们称为字符集 常见的字符集: ASCII - 美国人编码,使用7位来对美国常用的字符进 ...

  7. 编码方式的简介(ASCII, LATIN-1, UTF-8/16/32)

    编码方式的简介 1. ASCII ASCII是7比特的字符集,涵盖了英语中的绝大多数字符.编码从0到127. 2. ISOLatin-1(the ISO-8859-1 standard) ISO La ...

  8. 【转】刨根究底字符编码之十一——UTF-8编码方式与字节序标记BOM

    一.UTF-8编码方式 1. 接下来将分别介绍Unicode字符集的三种编码方式:UTF-8.UTF-16.UTF-32.这里先介绍应用最为广泛的UTF-8. 为满足基于ASCII.面向字节的字符处理 ...

  9. 【转】刨根究底字符编码之十——Unicode字符集的字符编码方式

    一.字符编码方式CEF的选择 1. 由于Unicode字符集非常大(并且作为开放字符集还在不断扩展之中),有些字符的编号(即码点值)需要两个或两个以上字节来表示,而要对这样的编号进行编码,也必须使用两 ...

最新文章

  1. MySQL的优化(大纲)
  2. BeautifulSoup中的.text方法和get_text()方法的区别
  3. Linux上创建一个用户,并给该用户指定目录的权限,修改时区
  4. 迷宫搜索问题最短路_迷宫的最短路问题(水+BFS宽搜)
  5. RSS、Atom和Feed概念与实现(django)
  6. [转帖]到底什么是时间复杂度
  7. DOD,与cisco三层模型
  8. 快速幂?再加个位运算吧
  9. 利用DynamipsGUI制作BSCI课程实验拓扑
  10. pwm控制直流电机转速流程图_一例PWM直流电机转速控制器的电路图,附电路原理分析...
  11. c语言 组合问题,排列组合问题 C语言
  12. 图片后缀和ContentType大全
  13. 关于学生和老师关系的换位思考
  14. 22考研全年备考规划表,这5个时间点你必须知道!
  15. python制作万年历
  16. java中sort函数的使用
  17. 简易支付平台(已对接微信支付)
  18. SpringBoot之AOP面向切面编程
  19. 串口通信数据格式与解析
  20. Turn off digital signature [Windows 64bit OS test driver数字签名出错的解法]

热门文章

  1. 零空间、点积与对偶性
  2. laravel 邮件发送
  3. 【图解线性代数】第四章—向量组及向量空间的几何意义
  4. 监控神器-普罗米修斯Prometheus的安装
  5. 大卫 异星觉醒 机器人_异星觉醒结局翻转恶心到观众?隐藏剧情暗含深意
  6. swfobject.js for flash 的使用(for swfobject 2.0)
  7. 百度云盘API文件上传参数详解
  8. VMware-WorkStation 序列号(转)
  9. VS中Qt 开发——无法解析的外部符号 QMetaObject 解决办法
  10. fld to xml and xml to fld