芒市网站建设,加强医院网站建设,wordpress 分类排序插件,wordpress 萝莉https://www.zhihu.com/question/28164512 关于编码和乱码的问题#xff0c;我简单讲一下。 通常问这类问题的人是混淆了若干个不同的概念#xff0c;并且他们自己也没有意识到自己混淆了这些概念的。 终端显示字符的编码#xff08;windows下终端是cmd#xff0c;linux下是…https://www.zhihu.com/question/28164512 关于编码和乱码的问题我简单讲一下。 通常问这类问题的人是混淆了若干个不同的概念并且他们自己也没有意识到自己混淆了这些概念的。 终端显示字符的编码windows下终端是cmdlinux下是各种terminal远程登录是putty或者xshellshell环境的编码。比如中文版windows用的是gbk向下兼容gb2312大多数linux发行版使用的是utf-8LANGzh_CN.UTF-8。文本文件的编码。这个通常取决于你的编辑器而且有的编辑器支持多种编码的话你可以在文本开头位置指定编辑器使用特定编码。比如# -*- coding: utf8 -*-vim看到这行会默认将这个脚本认定为utf-8兼容编码格式。应用程序的内部编码。一个字符串作为数据只是一个字节数组但是作为字符的数组就有一个解析方式。java和python的内部字符编码是utf-16python和java都支持用不同的编码来对字节数组进行decode来得到字符数组。 拿题主的问题来解释一下。 我在ubuntu kylin中文环境下默认terminal中做了同样的实验但是结果和题主恰好相反 看见没有 题主和我都没有说谎这是为什么呢因为 unicode(汉字,gb2312)这坨代码的含义实际上是将这里显示的这坨看上去像“汉字”的东西用gb2312解码转换为unicode字符串。unicode(汉字,utf-8)类似只不过是用utf-8解码转成unicode字符串。注这里涉及到两个概念——unicode字符集和utf-8编码——很多时候会用混淆一个字符集表示一堆符号而一种编码是用二进制表示这个字符集的一种编码方式。同样是unicode字符集可以有utf-8、utf-16、utf-32等等编码方式。 那这里显示的看上去像“汉字”的tmd的到底是个什么东西 如果是在我的环境下也就是linux utf-8环境下一个utf-8显示终端能显示成“汉字”的这坨东西它实际上是以utf-8编码的“汉”字和“字”字两个unicode字符。它们的真实字符值就是u\u6c49\u5b57内码可以用汉字.encode(hex)来查看当前终端下(utf-8编码值的十六进制码。。所以我的命令是将e6b189e5ad97这坨字节数组转换为unicode的字符数组。——结果毫无难度没有错误因为它本来就是utf-8编码所以能够正常作为unicode字符解码。但是unicode(汉字, gb2312)就不一样了这个命令等同于“将e6b189e5ad97这坨东西用gb2312编码方式来解码成字符”但是实际上由于编码空间并不兼容使用gb2312编码方式无法解码这么一坨奇葩的数据所以葛屁了。在题主的环境下因为系统终端和默认文件编码都是GBK所以这个数实际上是这个实际上是gbk(兼容gb2312)的字符“汉字”的真实字节数组。所以对这坨数据做unicode(汉字,utf8)会失败——因为不管你怎么想虽然看上去是一样但是实际上不是同一坨东西啊题主现在弄了一个文件在开始加上了# -*- coding: utf8 -*-这下编辑器看到了知道这文件是utf-8的了。所以编辑器对读入的一坨坨字节用utf-8来解码对于输出到磁盘的汉字也用utf-8来编码。所以你在文件里面看到的看上去像“汉字”的东西就和第一种情况下想同了当然代码就跑得通。顺便说一下如果编辑器无视行首这行编码声明或者编辑器无法支持utf-8格式那么你弄好的文件在那个编辑器下就会显示乱码多么简单的道理啊。所以要能够正常的显示中文或者其他什么乱七八糟奇葩的多字节文字以下条件缺一不可终端和环境的编码一致本机通常是一致的不一致常常出现在远程登录如果不一致就需要有编辑器或者文本阅读器做一个兼容两者的转换。编辑器能够认识文本编码系统拥有能显示这种字符的字体。这也就是我为什么一直反对在程序文本中使用除ascii之外的所有编码字符的原因。环境太复杂了绕开问题远比解决问题轻松。 转载于:https://www.cnblogs.com/xiaoerlang/p/7676765.html