免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6851 | 回复: 0

[系统管理] 灭【锟斤拷】乱码的神咒 [复制链接]

论坛徽章:
0
发表于 2022-06-30 16:43 |显示全部楼层
灭【锟斤拷】乱码的神咒

======================================
第一章:
很久以前,linux江湖中,有一个叫做【锟斤拷】的魔门。此门中人,善使乱码攻击。
【锟斤拷】门众必念神咒曰:
手持两把【锟斤拷】,口中疾呼【烫烫烫】。脚踏千朵【屯屯屯】,笑看万物【锘锘锘】。

【锟】门在江湖中,掀起了无尽的【烫】风【屯】雨!~

直到巨硬门发明的bom头。巨硬神咒曰:bom头,bom头!有头无乱码!vi支持bom头!

把一个中文文本文件,保存成bom+utf16le编码,复制到linux。
cat f.txt=乱码。vi f.txt=正常。证明vi支持bom头。

get-content是cat类似的命令。get-content f.txt永无乱码,而不管文本文件的编码是啥。

从此巨硬门人,很容易把【锟】打败!有了【bom头】,永远告别【锟斤拷】!

======================================
第二章:


巨硬的bom头,虽然打败了所有【文本文件乱码】,但这世界上还有很多,【命令行标准输出,管道输出乱码】。全归于【锟斤拷】门之功。

究其原因,是因为大家各自为政,没有“统一的编码,或者统一的编码交换,转换规则”。

因为世界太大,巨硬在【命令行界】没有那么大的话语权。所以【锟斤拷】门的,命令行乱码攻击,依然大行其道,困扰着用户。

所以目前为了兼容,需要用base64转码后,保存,传输。用的时候,再还原:
-------------灭【锟斤拷】神咒-------------
powershell:
[Convert]::ToBase64String([Encoding]::Unicode.GetBytes($str))
[Encoding]::Unicode.GetString([Convert]::FromBase64String($str))


python:
import base64
str = 'write-host "中文"'
b64str = base64.b64encode(str.encode("utf_16_le"))

最终,最好的方案,当然是让powershell团队,的英雄,定义一个【命令行标准输出,管道输出】规范。
这个规范,必须支持最新的unicode标准,支持emojs字符。还得大家都遵守才行。

======================================
第三章,锟斤拷乱码的由来:

源于GBK字符集和Unicode字符集之间的转换问题。
Unicode和老编码体系的转化过程中,肯定有一些字,用Unicode是没法表示的,
Unicode官方用了一个占位符来表示这些文字,这就是:U+FFFD REPLACEMENT CHARACTER。
那么U+FFFD的UTF-8编码出来,恰好是 '\xef\xbf\xbd'。
如果这个'\xef\xbf\xbd',重复多次,例如 '\xef\xbf\xbd\xef\xbf\xbd',然后放到GBK/CP936/GB2312/GB18030的环境中显示的话,一个汉字2个字节,
最终的结果就是:锟斤拷——锟(0xEFBF),斤(0xBDEF),拷(0xBFBD)。

烫烫烫乱码:
在windows平台下,ms的编译器(也就是vc带的那个)在 Debug 模式下,
会把未初始化的栈内存全部填成 0xcc,用字符串来看就是"烫烫烫烫烫烫烫",
未初始化的堆内存全部填成0xcd,字符串看就是“屯屯屯屯屯屯屯屯”。
也就是说出现了烫烫烫,赶紧检查初始化吧。。。

锘锘锘:
则是网页的乱码,也是编码问题,utf-8 与 GBK/gb2312

======================================
后记:

既然有xx神器,也必然有xx神咒,对吧?合理!

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP