博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2017-10-10 都市传说: "部分"中文出现乱码
阅读量:4649 次
发布时间:2019-06-09

本文共 1030 字,大约阅读时间需要 3 分钟。

事情起源于项目另一开发者在中文Windows下构建时遇到的.

当时很不解的是, 为什么会只有部分出现乱码. 第一感觉是, 如果编码转换不正确, 要么全乱码, 要么全正确. 为何会"部分"出现乱码.

初步分析. 简单说, 就是在转码过程中, Java会把某些它不认识的部分直接用某个值代替. 至于为何不默认保留原数据, 是个好的考古研究课题.

示例如下(除了"开始检", 其他都乱码了):

编码 原字1 原字2 原字3 原字4 原字5 原字6
原字
UTF8表示 e5 bc 80 e5 a7 8b e6 a3 80 e6 9f a5 e2 80 a6 e2 80 a6
转为GBK后 e5 bc 3f e5 a7 8b e6 a3 80 e6 9f a5 e2 3f a6 e2 3f 3f
转回UTF8 �? �?� �??

网上很多资源提到字符数是奇数会有问题, 这是没错. 但实际上即使偶数也可能会有问题. 上面的转换过程中, 80不是合法GBK字符, 就被替换成3f. 而替换过后再转回UTF8当然就挂了.

这个问题里的插件就是把输出字符串指定编码成了UTF8格式的数据, 但输出/解码时又用了系统默认的编码格式(GBK). 详见 · , .

个人觉得这种转码问题是除了亚洲/非洲之外的开发者很容易忽视的. UTF8的字符除了亚洲(包括中日韩)和非洲语言的字符用三字节数据表示外, 其他多数语言的字符都是用单字节或双字节. ). 这些UTF8中三字节的字符和GBK之类的双字节码转码时会更容易出问题.

在调查过程中, 还发现了其他一些类似疑问, 比如.

直觉是也是类似问题, 但想用编码互转的方式重现未果, 参考上面的例子试了几种2次转码, 都没有重现. 提到了CP1252编码, 又经过几次尝试, 才: "utf-8"->"windows-1252"->"iso-8859-1"->"utf-8".

阶段总结一下, 乱码问题的缘由都是编码互转. 全部乱码, 部分乱码都可能. 随着国外代码库/软件的编码方式更多地使用UTF8, 类似第二个问题的可能会变少, 但类似第一个的UTF8<->GBK互转的问题也许会存在很长一段时间.

转载于:https://www.cnblogs.com/program-in-chinese/p/partial_encoding_issue_for_Chinese_text.html

你可能感兴趣的文章
关于jedis2.4以上版本的连接池配置,及工具类
查看>>
记忆讲师石伟华微信公众号2017所有文章汇总(待更新)
查看>>
mechanize (1)
查看>>
FactoryBean
查看>>
Coolite动态加载CheckboxGroup,无法在后台中获取
查看>>
如何在我们项目中利用开源的图表(js chart)
查看>>
nfs服务器工作原理
查看>>
C3P0连接池工具类使用
查看>>
SVN常用命令备注
查看>>
孩子教育
查看>>
解决Cacti监控图像断断续续问题
查看>>
结构体的传参理解成员的存储方式
查看>>
python 进程与线程(理论部分)
查看>>
什么是API
查看>>
Java反射中method.isBridge() 桥接方法
查看>>
[shiro学习笔记]第二节 shiro与web融合实现一个简单的授权认证
查看>>
强名称程序集(strong name assembly)——为程序集赋予强名称
查看>>
1028. List Sorting (25)
查看>>
BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划
查看>>
ubuntu 重启命令,ubuntu 重启网卡方法
查看>>