Windows的编码及Dev-C++编码

最近在搬砖时碰到了软件工程师最头疼的问题之一——编码问题。这里稍微做一下小节。
本博客介绍了:

  1. 编码的基础知识
  2. 如何转换编码
  3. 最后的结论——退Dev-C++保平安

一. 输入法的编码

在我们把我们的文本输入到相应的editor中时,可能会使用到输入法(比如我们输入中文的时候就要用到中文输入法,但是显然使用英文的时候并不需要)。
显然,我们的输入法也是有对应的编码的。所以我们很自然就有下面两个疑惑:

  1. 我们的输入法选用的是什么编码?
  2. 为什么当我们像不同编码的editor中输入文本时,永远不会出现乱码?
    轮子哥的回答给了我们很好的解释
    在这里插入图片描述
    首先,我们使用的内置输入法使用的是UTF-16编码
    其次,Windows内置的API会自动转化到相应editor中的编码。

二. Source中的编码

我们现在所提的source中的编码指的是editor中的编码。
众所周知,editor中的编码,最重要的就是编码和解码的格式相一致。你用UTF-8格式保存的源代码,如果用GB18030打开,那就可能出现乱码(当然也有可能不出现乱码——比如你的代码中一个中文字符也没有)
这个主要的内容我就不细讲了,但是有一点非常重要的,就是编辑器中的编码和我们系统底层的编码还有差别。
来源:Python廖雪峰
这里以记事本为例,可见我们操作系统底层使用的是UTF-8编码,这种编码极大地节省了内存,不过这也是一种空间换时间的做法——UTF-8虽然能节省空间,但是解码比较复杂,耗费的时间也比较多。

三. Terminal中的编码

我们一般在写练习题的时候,一般都会选择用终端来输出结果。
其实终端也有其对应的编码,这个可以用属性来查看。
特别注意:这里只针对Windows,对于Linux,其终端编码一般是UTF-8
在这里插入图片描述
正如上图中我们用红色圆圈圈出来的那样,我们的终端使用的是ANSI和GBK来编码的,这里就很有必要提一下ANSI,它和ASCii长得很像,但是却是两码事情:
在这里插入图片描述由此可见,ANSI是ASCii的扩展,它的前128位用来兼容ASCii,后面几位(之所以这里说后面几位,是因为ANSI可能会占用多个字节,它不是传统意义上的扩展ASCii编码)用来编码其它语言。

这就可能导致一个很有意思的现象——那就是ANSI不兼容问题
ANSI后面几位编码是中文还是日文还是韩文,其实要看厂家。所以,当你用ANSI打开远在日本的友人用ANSI编码的源文件时,很可能会出现乱码。

至于如何修改terminal中的编码,请移步:如何修改terminal中的编码?

四. C/C++中宽字符的使用

这个可以视为是的延伸。我把它单独列出来其实是因为它是C语言本身的问题。
这个问题就是:C中的字符都是按一个字节存储的。有时候我们需要中文的字符,显然中文的字符用一个字节是存储不了的,那该如何是好呢?

还好维护C的大神们早就想到了这个问题,并及时添加了<locale.h>头文件。
在引入相应头文件和代码以后,我们就可以使用一种叫做宽字符的类型。
也就是说,字符类型从char变为了wchar_t类型
相应的,我们使用的标准库函数(如strlen等)都要改为对应的宽字符的库函数

有关宽字符的教程在网上多如牛毛,想要了解请移步相应博客。
BTW,Win32编程中,也有提供不同编码类型的方法, 这个请移步MSDN

五. Dev-C++中的编码

其实笔者今天主要还是想讲这个问题。作为专注于初学者使用的IDE(这么说是因为没有人会用Dev-C++写project),它的槽点比较多,其中有一个就是编码的问题。
直接给出结论:Dev-C++不能转换编码,且Dev-C++不支持UTF-8
在我的PC上,经过测试,他使用的是GBK编码(这个我是看乱码得出的结论(逃)。
来源:StackOverflow

六. 如何转换编码

俗话说得好:实践才能出真知。下面我就来讲讲怎么转换编码。
听巨佬说这里所谓的Unicode其实是UTF-16编码
首先, Windows自带的Notepad就有转换编码的功能,但是不在菜单栏,而是在保存的时候
在这里插入图片描述
之前我们提到,我们的CMD使用的是ANSI和GBK的编码,在这里大家可以用UTF-8保存,然后再CMD中用type命令查看,看看是什么结果

其次,我们强大的notepad++,可以直接改变我们的编码:
在这里插入图片描述
最后提一下我现在最喜欢的IDE:vscode,改变编码的方式在右下角
在这里插入图片描述至于其它的editor,可以自行百度,这里不提了。

七.关于乱码

这个当作一个小彩蛋送给大家吧。
我们程序员有一首流传已久的诗:

手持两把锟斤拷 
口中疾呼烫烫烫 
脚踏千朵屯屯屯 
笑看万物锘锘锘

为了尽量不离题,我们这里只提所谓“锟斤拷”是怎么来的
(烫烫烫和屯屯屯是堆和栈未初始化,而锘锘锘是BOM相关的,这个虽说有点关系,但这里不提)
在这里插入图片描述所以,当代码中出现了这三个字的时候,说明是Unicode文本转换到了GBK/GB2312/GB18030中(我Dev-C++的编码就是这么推断出来的)

  • 23
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值