- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[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代码??InputStreamReader?reader=new?InputStreamReader(fin,?charset)??1. 如果这个UTF-16文件里带有BOM的话, charset就用UTF-16, java会自动根据BOM判断LE还是BE, 如果你在这里指定了UTF-16LE或UTF-16BE的话, 猜错了会生成乱七八糟的文件, 哪怕猜对了, java也会把头2个字节当成文本输出给你而不会略过去, 因为[FF FE]或[FE FF]这2个代码没有内容, 所以, windows会用?代替给你?2. 如果这个UTF-16文件里不带BOM的话, 则charset就要用UTF-16LE或UTF-16BE来指定LE还是BE的编码方式?另外, UTF-8也有BOM的, [0xEF, 0xBB, 0xBF], 但可有可无, 但用windows的notepad另存为时会自动帮你加上这个, 而很多非windows平台的UTF8文件又没有这个BOM, 真是难为我们这些程序员啊?错误的例子?1. 文件A, UTF16格式, 带BOM LE,?InputStreamReader reader=new InputStreamReader(fin, utf-16le)?会多输出一个?在第一个字节, 原因: java没有把头2位当成BOM?2. 文件A, UTF16格式, 带BOM LE,?InputStreamReader reader=new InputStreamReader(fin, utf-16be)?会出乱码, 原因: 字节的高低位弄反了, a 在文件里 [0x61, 0x00], 但java以为a应该是[0x00 0x61]?3. 文件A, UTF16格式, 带BOM BE,?InputStreamReader reader=new InputStreamReader(fin, utf-16le)?会出乱码, 原因: 字节的高低位弄反了, a 在文件里 [0x00, 0x61], 但java以为a应该是[0x61 0x00]?4. 文件A, UTF16格式, 带BOM BE,?InputStreamReader reader=new InputStreamReader(fin, utf-16be)?会多输出一个?在第一个字节, 原因: java没有把头2位当成BOM?5. 文件A, UTF16格式, LE 不带BOM,?InputStreamReader reader=new InputStreamReader(fin, utf-16)?会出乱码, 因为utf-16对于java来说, 默认为be(1.6JDK, 以后的说不准
文档评论(0)