云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > CharsetUTF-8, UTF-16, UTF-16LE, UTF-16BE的区别

CharsetUTF-8, UTF-16, UTF-16LE, UTF-16BE的区别

  • 62 次阅读
  • 3 次下载
  • 2025/7/8 14:19:31

[Charset]UTF-8, UTF-16, UTF-16LE, UTF-16BE的区别

最近遇到的麻烦事

charset里的问题, 一般我们都用unicode来作为统一编码, 但unicode也有多种表现形式

首先, 我们说的unicode, 其实就是utf-16, 但最通用的却是utf-8,

原因: 我猜大概是英文占的比例比较大, 这样utf-8的存储优势比较明显, 因为utf-16是固定16位的(双字节), 而utf-8则是看情况而定, 即可变长度, 常规的128个ASCII只需要8位(单字节), 而汉字需要24位

UTF-16, UTF-16LE, UTF-16BE, 及其区别BOM 同样都是unicode, 为什么要搞3种这么麻烦? 先说UTF-16BE (big endian), 比较好理解的, 俗称大头 比如说char 'a', ascii为

0x61, 那么它的utf-8, 则为 [0x61], 但utf-16是16位的, 所以为[0x00, 0x61] 再说UTF-16LE(little endian), 俗称小头, 这个是比较常用的

还是char 'a', 它的代码却反过来: [0x61, 0x00], 据说是为了提高速度而迎合CPU的胃口, CPU就是这到倒着吃数据的, 这里面有汇编的知识, 不多说

然后说UTF-16, 要从代码里自动判断一个文件到底是UTF-16LE还是BE, 对于单纯的英文字符来说还比较好办, 但要有特殊字符, 图形符号, 汉字, 法文, 俄语, 火星语之类的话, 相信各位都很头痛吧, 所以, unicode组织引入了BOM的概念, 即byte order mark, 顾名思义, 就是表名这个文件到底是LE还是BE的,

其方法就是, 在UTF-16文件的头2个字节里做个标记: LE [0xFF, 0xFE], BE [0xFE, 0xFF]

理解了这个后, 在java里遇到utf-16还是会遇到麻烦, 因为要在文件里面单独判断头2个再字节是很不流畅的 小结:

Java代码 1. InputStreamReader reader=new InputStreamReader(fin, charset)

1. 如果这个UTF-16文件里带有BOM的话, charset就用\会自动根据BOM判断LE还是BE, 如果你在这里指定了\或\的话, 猜错了会生成乱七八糟的文件, 哪怕猜对了, java也会把头2个字节当成文本输出给你而不会略过去, 因为[FF FE]或[FE FF]这2个代码没有内容, 所以, windows会用\代替给你

2. 如果这个UTF-16文件里不带BOM的话, 则charset就要用\或\来

指定LE还是BE的编码方式

另外, UTF-8也有BOM的, [0xEF, 0xBB, 0xBF], 但可有可无, 但用windows的notepad另存为时会自动帮你加上这个, 而很多非windows平台的UTF8文件又没有这个BOM, 真是难为我们这些程序员啊

错误的例子

1. 文件A, UTF16格式, 带BOM LE,

InputStreamReader reader=new InputStreamReader(fin, \会多输出一个\在第一个字节, 原因: java没有把头2位当成BOM

2. 文件A, UTF16格式, 带BOM LE,

InputStreamReader reader=new InputStreamReader(fin, \

会出乱码, 原因: 字节的高低位弄反了, 'a' 在文件里 [0x61, 0x00], 但java以为'a'应该是[0x00 0x61]

3. 文件A, UTF16格式, 带BOM BE,

InputStreamReader reader=new InputStreamReader(fin, \

会出乱码, 原因: 字节的高低位弄反了, 'a' 在文件里 [0x00, 0x61], 但java以为'a'应该是[0x61 0x00]

4. 文件A, UTF16格式, 带BOM BE,

InputStreamReader reader=new InputStreamReader(fin, \会多输出一个\在第一个字节, 原因: java没有把头2位当成BOM

5. 文件A, UTF16格式, LE 不带BOM,

InputStreamReader reader=new InputStreamReader(fin, \会出乱码, 因为utf-16对于java来说, 默认为be(1.6JDK, 以后的说不准) 但windows的notepad打开正常, 因为notepad默认为le, - -#

6. 文件A, UTF16格式, BE 不带BOM,

InputStreamReader reader=new InputStreamReader(fin, \恭喜你, 蒙对了

但winodws的notepad打开时, 每个字符中间都多了一个\因为notepad把它当成ASNI了

在windows下输出unicode文件 通过java出来unicode文件, 也容易混淆

Java代码 1. FileOutputStream fout=new FileOutputStream(file); 2. OutputStreamWriter writer=new OutputStreamWriter(fout, charset);

1. charset为\时, java会默认添加BOM [0xFE, 0xFF], 并以BE的格式编写byte 2. charset为\时, java不会添加BOM, 但编码方式为 BE 3. charset为\时, java不会添加BOM, 但编码方式为 LE

以上通过 test.getByte(\可以验证

而windows的notepad默认的unicode为 LE, 并带BOM, 所以, 推荐输出 UTF-16LE, 并人为添加BOM, 即:

Java代码 1. byte[] bom={-1, -2}; //FF FE, java的byte用的是补码, 验证: b=127, b+=1, 而b=-128 2. fout.write(bom);

搜索更多关于: CharsetUTF-8, UTF-16, UTF-16LE 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

[Charset]UTF-8, UTF-16, UTF-16LE, UTF-16BE的区别 最近遇到的麻烦事 charset里的问题, 一般我们都用unicode来作为统一编码, 但unicode也有多种表现形式 首先, 我们说的unicode, 其实就是utf-16, 但最通用的却是utf-8, 原因: 我猜大概是英文占的比例比较大, 这样utf-8的存储优势比较明显, 因为utf-16是固定16位的(双字节), 而utf-8则是看情况而定, 即可变长度, 常规的128个ASCII只需要8位(单字节), 而汉字需要24位 UTF-16, UTF-16LE, UTF-16BE, 及其区别BOM 同样都是unicode, 为什么要搞3种这么麻烦? 先说UTF-16BE (big en

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com