目标:解释符号与编码,分析乱码问题,于是就能明明白白地处理大多数符号乱码问题了。
符号与编码
以C++为例,
- 符号
A 的(十进制)编码为65 。即'A' 为65。其中,A 亦为字面值。ASCII包含以其他扩展编码中,A 属于ASCII码。 - 符号回车
<CR> 的ASCII为13 。其中,<CR> 无字面值,故通过数字转义序列'0x0D' 或符号转义序列\n 表示。 符号与编码的查询网址:[汉字字符集编码查询]
unicode [-]
Unicode其实不是一种编码, 而是定义了一个表, 表中为世界上每种语言中的每个字符设定了统一并且唯一的码位 (code point),以满足跨语言、跨平台进行文本转换的要求。 如果一个人想写不同的语言,那他最好使用Unicode。 Unicode 用多少个字节呢?0个 。
编码字符集
从信息论知,编码有定长编码和可变长编码:[-]
- gbk: 显示中文,的长度为2个字节
- utf-8:包含全世界所有国家需要用的字符,它比较灵活,长度在1-6个字节
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rEx6Fvlw-1653107691013)(:/597c0a5797e9424686ffa05f0ec33a6b)] 例:汉 字,Unicode编码是0x6C49 ,查utf-8表知,字符长度为3 。即:std::cout <<sizeof("汉") << std::endl; 显示4 。
常用应用编码设置
只有撰写和显示都基于相同的编码,那么就不会乱码。 而复制粘贴时,内容会在剪切板进行中转[-],即复制端到剪切板会变为统一编码,剪切板到粘贴端再重新转为特定编码。而对于比较老的软件,比如Keil和VC6.0,这一转换过程无法自动实现,那么就需要sublime等工具进行手动转换了。而VScode则不会出现复制粘贴的乱码问题,除非问题中已经存在乱码。
撰写端
这里的撰写端指的是首要目的是将符号以特定编码输入到文件的应用,例如文本编码器或IDE。因为要边写边看,所以其自然也带有显示功能。
从notepad++开始
输入法与文件编码的关系:一个文件首先确认其编码类型A ,将以编码类型A 来显示字符,同时输入法自动以A 编码将字符输入到文件中。此时, [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-72MCZbIZ-1653107691014)(:/9e0783ad6d274323ae754d2b8f41d092)]
- 若使用编码
B ,那么文件的存储信息并未改变,而是以编码B 的方式进行显示(即映射),这样看到的中文字符就变乱码了。同时,后续输入法将自动输入编码B 。 - 若转为编码
B ,那么文件的存储信息将改变,此时显示和文件存储信息皆应用了编码B 。
vscode
详见[CSDN-牛肉粉面:VScode修改文件默认编码]
- 单一文件设置(高优先级,但关闭文件后不保存设置):点击VScode下方的编码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3JmpLgQc-1653107691015)(:/22b8422014f2463c8c33acee6990f5c4)] settings .json (中优先级):如下设置后,将有限适用UTF-8 撰写和显示文件,但当系统认为有更合适的编码时,将自动选择该编码。
"files.encoding": "utf8",
"files.autoGuessEncoding": true,
- 全局设置(低优先级):
Ctrl+Shift+P →Open Settings(UI) →encoding →选择编码
sublime
更好用的编码转换软件
浏览器
编码与浏览器本身无关,与网址有关。 百度搜索编码的格式与国际上面其他搜索的格式有所不同,比如google搜索的是UTF-8,但是百度使用的是GB2312编码。
显示端
cmd
[CSDN-永久修改cmd命令窗口的编码格式] 查询:chcp 修改:chcp <codeid>
code id | code type |
---|
65001 | utf-8 | 20936 | GB2312 | 936 | GBK(default) | 437 | American English |
|