对中文乱码的理解,遇到乱码该怎么办。

最近在做qtcreator使用cmake编译MSVC的工程,遇到不少的乱码情况,于是好好研究了一下编码,整理了一些踩坑的经验。

一、中文乱码的来源

目前常见到的中文编码其实就两种,UTF8和GBK。

我们遇到的绝大多数乱码,就是系统使用中文时,这两种编码被解析成了另一种。

在nodepad++中做个实验如下:

比如一个UTF8编码的"你好",使用GBK格式编码后显示如下:

一个GBK格式的"你好",使用UTF8编码后显示如下:

在cmd终端和powershell中基本也是同样的效果:

二、对乱码问题的分析

当遇到乱码情况时,从乱码内容就可以看出一些端倪。

首先要知道,GBK主要针对中文编码,所以即使胡乱编码,大概率还是编成了一堆汉字,就像上文的"浣犲ソ"。

然后,UTF8是万国码,预留了很多空闲编码位置,所以乱编码的时候,就很容易编成了未定义的字符。

所以,现在当你看到一堆乱码,就可以分析了:

1、当这堆乱码是一堆混乱的中文,那大概率是原本是UTF8格式的内容,然后被编码成了GBK。

2、当这堆乱码是一堆看不懂的符号时,大概率是原本是GBK格式的内容,然后被编码成了UTF8。

对于简单的情况,基本知道原因就知道如何解决了。

另外,像常见的"锟斤拷"就是UTF8被编码成了GBK。

三、对乱码的排查

乱码的来源五花八门,我这里只能说一个通用的排查方法。

从字符的源头出来,到终点,去了解中间每一步有可能涉及到编码的工具的编码处理格式。

比如,我通过windows终端的 type 命令显示了一个文件,结果是乱码。那么这中间可能涉及到编码的就有三个东西:原文-type-终端输出流。只需要依次检查这三个对中文的编码格式是否一致。例如,检查原文的时候,先用notepad++打开,看看原文编码方式。然后查一下type这个命令有没有处理文件编码,有的话是怎么处理的,怎么调整。最后看一下我使用的终端cmd、ps等默认是用什么编码,怎么修改。把这三个编码统一,乱码问题就迎刃而解了。

又比如,我使用了qtcreator打开一个使用基于msvc编译的cmake工程,结果编译时,输出端乱码了。这中间可能就涉及到,msvc编译输出内容-cmake处理-qtcreator终端输出。不过最后排查出来cmake对流程没有影响,是qtcreator有个控制终端是用UTF8选项勾错了,这里也贴一下。

相关推荐
三只蛋黄派22 天前
Java文件写入与编码、字节数组、字符集、字符编解码 一文打通!
字符集·编码
墨雪遗痕2 个月前
中文Windows系统下程序输出重定向乱码问题解决方案
rust·编码·powershell
伊织code5 个月前
macOS 使用 enca 识别 文件编码类型(比 file 命令准确)
macos·文件·编码·file·iconv·enca
伊织code5 个月前
macOS 使用 iconv 转化文件编码
macos·乱码·文件·编码·转换·iconv
星尘安全7 个月前
GitHub Copilot 越狱漏洞
人工智能·ai·copilot·编码·越狱
荣--7 个月前
HiJobQueue:一个简单的线程安全任务队列
c++·编码
core5129 个月前
一文说清flink从编码到部署上线
flink·部署·yarn·编码·cdc·guava30·guava18
H轨迹H9 个月前
2024御网杯信息安全大赛个人赛wp_2024-11-27
ctf·编码·misc
帅逼码农9 个月前
GRS码(Generalized Reed-Solomon Code)
编码·grs码