Java_字符编码(Unicode、UTF-8、UTF-16)
来源:互联网 发布:php获取对象的属性值 编辑:程序博客网 时间:2024/06/06 17:32
首先看一下下面的程序(测试英文和中文在Unicode、UTF-8、UTF-16这三种编码下,一个字符占几个字节)
运行结果如下:
a(Unicode) :4
a(Unicode) :6
啊(Unicode) :4
啊啊(Unicode) :6
a(UTF-8) :1
aa(UTF-8) :2
啊(UTF-8) :3
啊啊(UTF-8) :6
a(UTF-16) :4
aa(UTF-16) :6
啊(UTF-16) :4
啊啊(UTF-16) :6
可以看到UTF-8的情况:一个英文字符占一个字节,一个汉字占三个字节
但是Unicode和UTF-16的情况比较奇怪,不管是英文还是汉字,看不出占几个字节。其实正确的答案是:Unicode和UTF-16的编码下,不管是英文字符还是汉字字符,都占两个字节(至于上面结果中多出来的两个字节是用来表示字节顺序的默认字节)。至于为什么,继续往下看。
Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。
(Unicode是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案。Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。)
在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。
这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。
在 Java 中直接使用Unicode 转码时会按照UTF-16LE 的方式拆分,并加上 BOM。 如果采用 UTF-16 拆分,在 Java 中默认采用带有 BOM 的 UTF-16BE 拆分。
再来看一个程序:
运行结果如下:
Unicode fe ff 4e 2d 56 fd
UnicodeBig fe ff 4e 2d 56 fd
UnicodeLittle ff fe 2d 4e fd 56
UnicodeBigUnmarked 4e 2d 56 fd
UnicodeLittleUnmarked 2d 4e fd 56
UTF-16 fe ff 4e 2d 56 fd
UTF-16BE 4e 2d 56 fd
UTF-16LE 2d 4e fd 56
可以看到几个不同的Unicode和UTF-16编码的字节顺序是不同的,有的是fe ff,有的是ff fe,有的没有。
总上所述:
Unicode和UTF-16:1个字符占2个字节(不管是哪国语言)
UTF-8:1个英文字符占1个字节,一个汉字(包括日文和韩文等)占3个字节
Java中的char默认采用Unicode编码,所以Java中char占2个字节
另外,顺便提一个知识点:1个字节(byte)占8位(bit)
原文链接:http://blog.csdn.net/tianjf0514/article/details/7854624
- Java_字符编码(Unicode、UTF-8、UTF-16)
- Java_字符编码(Unicode、UTF-8、UTF-16)
- Java_字符编码(Unicode、UTF-8、UTF-16)
- Java_字符编码(Unicode、UTF-8、UTF-16)
- 字符编码 Unicode UTF-8 UTF-16 UTF-32 ANSI
- 字符编码方式及判断整理(ANSI,Unicode,utf-8,utf-16,utf-32)
- 字符编码总结(UTF-8,UNICODE)
- 字符编码, Unicode, UTF-8
- 字符编码,ansi, unicode,utf-8, utf-16
- [转]字符编码,ansi, unicode,utf-8, utf-16
- 字符编码,ansi, unicode,utf-8, utf-16
- 字符编码 ansi, unicode, utf-8, utf-16
- 字符编码(UNICODE,UTF-8,UTF-16)的理解
- 字符集(ASCII ANSI UNICODE)与字符编码 (UTF-8 UTF-16)
- 字符编码笔记:ASCII、Unicode、UTF-8、UTF-16、UCS、BOM、Endian(转)
- Java中的字符编码(Unicode、UTF-8、UTF-16)的那些事儿
- 字符编码(Unicode UTF-16 UTF-8 ANSI)学习总结
- Java中的字符编码(Unicode、UTF-8、UTF-16)的那些事儿
- Linux ifconfig command not found
- UVa 1347 Tour
- 使用JDK自带jvisualvm监控tomcat和java程序
- 代理模式
- 使用HttpURLConnection请求Gson网络解析数据
- Java_字符编码(Unicode、UTF-8、UTF-16)
- Python3 字典(dict, map, 关联数组)
- ch340 win7 64位驱动下载 win10也可以用
- iOS开发,json解析
- Java Ant 学习总结
- 【VS开发】字符串进制等转换关系及方法
- 4.Your test database is running in NOARCHIVELOG mode. Which statement is true regarding the type of
- 探索《How Tomcat Work》 心得(六) 加载器 下 Java中URL、tomcat加载器WebappLoader和WebappClassLoader
- android前端与后端服务器URL地址栏传输中文字符出现乱码问题