前言
初学者在Windows平台上进行C/C++语言(中文)程序开发时,有时会遇到编译报错、在控制台运行时显示中文乱码的问题。
本文就此类问题进行描述、展开原因分析,然后给出解决方法。
本次分享内容的目录如下:
基本概念(字符集、字符编码、代码页、GBK、UTF-8)
问题描述(示例源码、编译报错、中文乱码)
原因分析(编码环节简介、原因分析)
解决方法(解决思路、编译报错解决、中文乱码解决)
结束语
1. 基本概念
本文会涉及到如下基本概念:
1.1 Charset(字符集)
Charset(字符集):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。常见的字符集有:ASCII字符集、Unicode字符集等。
计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。
1.2 Character Encoding(字符编码)
Character Encoding(字符编码)用于为指定集合中某一对象(如电脉冲、比特模式等),以便文本在计算机中存储和通过通信网络的传递。字符编码就是将符号转换为计算机可以接受的数字系统的数。常见的例子:将拉丁字母表编码成ASCII。
注:术语字符编码(Character Encoding)、字符映射(Character Map)或者代码页(CodePage),在历史上往往是同义概念,即字符表(repertoire)中的字符如何编码为码元的流(stream of code units)–通常每个字符对应单个码元。
1.3 CodePage(代码页)
CodePage(代码页)是字符编码的别名,也称内码表,是特定语言的字符集的一张表。
-
OEM(IBM PC)代码页:指计算机的BIOS所支持的字符集编码。最具代表性的是"代码页437(IBM PC或MS-DOS )"。
-
Windows(ANSI)代码页:微软针对不同的使用地区与国家,定义了一系列的支持不同语言字符集的代码页。最具代表性的是代码页WINDOWS-1252 (实现了ISO-8859-1)。
注:Windows代码页最初是根据ANSI草案实现的,这个草案最终成为ISO 8859-1。这是Windows代码页被称作ANSI的缘由。
本文涉及到的两个重要代码页介绍如下:
-
代码页936:该代码页对应的是GBK编码。既是OEM代码页,也是ANSI代码页。
-
代码页65001:该代码页对应的是UTF-8编码。
Windows平台上的GUI程序使用ANSI代码页,而在控制台程序使用OEM代码页(以便向后兼容)。
在Windows系统中的命令行窗口可以通过chcp命令来显示当前代码页(如Windows 7 简体中文操作系统上默认的代码页是936):
C:> chcp 活动代码页: 936
也可以通过在chcp命令后带一个具体整数参数(代码页数值)来临时改变命令行窗口的当前代码页(如临时修改为UTF-8对应的65001):
C:> chcp 65001 Active code page: 65001
1.4 GBK(汉字内码扩展规范)
GBK(英文全称:Chinese Internal Code Extension Specification,中文全称:汉字内码扩展规范)是对GB2312-80的扩展,也就是代码页936的扩展(之前代码页936和GB2312-80一模一样),最早实现于Windows 95简体中文版。
GBK总体编码范围为0x8140~0xFEFE,首字节在 0