C程序的编码方式


一、编码

编码是用预先规定的方法将文字、数字或其它对象编成数码。为保证编码的正确性,编码要规范化、标准化,即需有标准的编码格式。

  • 我们都知道文本在计算机中是以二进制来进行存储,这就需要把文字通过一定的规则转换成二进制来存储。这种规则就是编码。
  • 每个不同的国家,不同的地区都有自己不同的语言文字,这些文字通过不同的编码,转换成二进制信息进行存储。使用什么编码格式编码,就需要使用相同的格式解码。
  • 为了便于文件全球化交换与使用,有一些编码规则支持了很多语言的转换规则。通过这种编码规则,就可以支持多种语言。
  • 常见的编码格式有ASCII、ANSI、GBK、GB2312、UTF-8、GB2312-80和Unicode等。

二、C语言的编码

  • C语言是 70 年代的产物,那个时候只有ASCII,各个国家的字符编码都还未成熟,所以C语言不可能从底层支持 GB2312、GBK、Big5、Shift-JIS等国家编码,也不可能支持 Unicode 字符集。

  • 在C语言中字符有两种,一种是窄字符,另一种是宽字符。

    • 只有 char 类型的窄字符才使用 ASCII 编码
    • char 类型的窄字符串、宽字符和宽字符串都不使用 ASCII 编码!
  • 可以肯定的说,在现代计算机中,窄字符串已经不再使用 ASCII 编码了,因为 ASCII 编码只能显示字母、数字等英文字符,对汉语、日语、韩语等其它地区的字符无能为力。对于窄字符串,C语言并没有规定使用哪一种特定的编码,只要选用的编码能够适应当前的环境即可,所以,窄字符串的编码与操作系统和编译器有关。


三、程序的编码

  • 源文件使用什么编码
    源文件用来保存我们编写的代码,它最终会被存储到本地硬盘,或者远程服务器,这个时候就要尽量压缩文件体积,以节省硬盘空间或者网络流量,而代码中大部分的字符都是 ASCII 编码中的字符,用一个字节足以容纳,所以 UTF-8 编码是一个不错的选择。

    UTF-8 兼容 ASCII,代码中的大部分字符可以用一个字节保存;另外 UTF-8 基于 Unicode,支持全世界的字符,我们编写的代码可以给全球的程序员使用,真正做到技术无国界。

  • 常见的 IDE 或者编辑器使用的编码

    • 绝大多数的编译器,如:Xcode、Sublime、Text、Gedit、Vim等,在创建源文件时一般也默认使用 UTF-8 编码。
    • 奇葩 Visual Studio 它默认使用本地编码来创建源文件。

    • 所谓本地编码,就是像 GBK、Big5、Shift-JIS 等这样的国家编码(地区编码);针对不同国家发行的操作系统,默认的本地编码一般不同。简体中文本的 Windows 默认的本地编码是 GBK。
    • 这就导致 Visual Studio在上传github时,出现中文乱码的现象。需要将文件强制转换成utf-8的编码模式。再进行上传。

ps :对于使用 Visual Studio 上传github的用户。可以使用本地代码转换器,将GBK->UTF-8,便于在github Desktop中查看(github Desktop 不会转码,中文会出现乱码情况)。不过 github网页的代码会自动转码,不会出现乱码。

  • 程序编译时的编码

1) 微软编译器使用本地编码来保存这些字符。不同地区的 Windows 版本默认的本地编码不一样,所以,同样的窄字符串在不同的 Windows 版本下使用的编码也不一样。对于简体中文版的 Windows,使用的是 GBK 编码。

2) GCC、LLVM/Clang 编译器使用和源文件相同的编码来保存这些字符:如果源文件使用的是 UTF-8 编码,那么这些字符也使用 UTF-8 编码;如果源文件使用的是 GBK 编码,那么这些字符也使用 GBK 编码。

你看,对于代码中需要被处理的窄字符串,不同的编译器差别还是挺大的。不过可以肯定的是,这些字符始终都使用窄字符(多字节字符)编码。

对于 char 类型的窄字符串,微软编译器使用本地编码,GCC、LLVM/Clang 使用和源文件编码相同的编码。


四、编码字符集和运行字符集

  • 站在专业的角度讲,源文件使用的字符集被称为编码字符集,也就是写代码的时候使用的字符集;程序中的字符或者字符串使用的字符集被称为运行字符集,也就是程序运行后使用的字符集。
    • 源文件需要保存到硬盘,或者在网络上传输,使用的编码要尽量节省存储空间,同时要方便跨国交流,所以一般使用 UTF-8,这就是选择编码字符集的标准。
    • 程序中的字符或者字符串,在程序运行后必须被载入到内存,才能进行后续的处理,对于这些字符来说,要尽量选用能够提高处理速度的编码,例如 UTF-16 和 UTF-32 编码就能够快速定位(查找)字符。

ps :编码字符集是站在存储和传输的角度,运行字符集是站在处理或者操作的角度,所以它们并不一定相同。

最全ASCII码对照表 Bin               Dec     Hex         缩写/符                                       解释 0000 0000     0           00             NUL (null)                                       空符    0000 0001     1           01             SOH (start of handing)                   标题开始  0000 0010     2           02             STX (start of text)                           正文开始  0000 0011     3           03             ETX (end of text)                           正文结束 0000 0100     4           04             EOT (end of transmission)             传输结束  0000 0101     5           05             ENQ (enquiry)                               请求  0000 0110     6           06             ACK (acknowledge)                       收到通知  0000 0111     7           07             BEL (bell)                                       响铃 0000 1000     8           08             BS (backspace)                             退格  0000 1001     9           09             HT (horizontal tab)                         水平制表符  0000 1010     10         0A             LF (NL line feed, new line)             换行键  0000 1011     11         0B             VT (vertical tab)                             垂直制表符  0000 1100     12         0C             FF (NP form feed, new page)         换页键  0000 1101     13         0D             CR (carriage return)                       回车键 0000 1110     14         0E             SO (shift out)                                 不用切换  0000 1111     15         0F             SI (shift in)                                     启用切换  0001 0000     16         10             DLE (data link escape)                   数据链路转义  0001 0001     17         11             DC1 (device control 1)                   设备控制1  0001 0010     18         12             DC2 (device control 2)                   设备控制2  0001 0011     19         13             DC3 (device control 3)                   设备控制3  0001 0100     20         14             DC4 (device control 4)                   设备控制4  0001 0101     21         15             NAK (negative acknowledge)         拒绝接收  0001 0110     22         16             SYN (synchronous idle)                 同步空闲  0001 0111     23         17             ETB (end of trans. block)               传输块结束  0001 1000     24         18             CAN (cancel)                                 取消 0001 1001     25         19             EM (end of medium)                       介质中断  0001 1010     26         1A             SUB (substitute)                             替补  0001 1011     27         1B             ESC (escape)                                 溢出  0001 1100     28         1C             FS (file separator)                         文件分割符  0001 1101     29         1D             GS (group separator)                     分组符  0001 1110     30         1E             RS (record separator)                   记录分离符  0001 1111     31         1F             US (unit separator)                         单元分隔符
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值