风暴俱乐部|Windows平台C语言程序在控制台显示中文乱码分析及解决


风暴俱乐部|Windows平台C语言程序在控制台显示中文乱码分析及解决前言初学者在Windows平台上进行C/C++语言(中文)程序开发时 , 有时会遇到编译报错、在控制台运行时显示中文乱码的问题 。
本文就此类问题进行描述、展开原因分析 , 然后给出解决方法 。
本次分享内容的目录如下:
基本概念(字符集、字符编码、代码页、GBK、UTF-8)
问题描述(示例源码、编译报错、中文乱码)
原因分析(编码环节简介、原因分析)
解决方法(解决思路、编译报错解决、中文乱码解决)
结束语
1. 基本概念
风暴俱乐部|Windows平台C语言程序在控制台显示中文乱码分析及解决本文会涉及到如下基本概念:
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的缘由 。
【风暴俱乐部|Windows平台C语言程序在控制台显示中文乱码分析及解决】本文涉及到的两个重要代码页介绍如下:
  • 代码页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 , 首字节在 0x81~0xFE 之间 , 尾字节在 0x40~0xFE 之间 , 剔除 xx7F 一条线 。 GBK共收录21886个汉字和图形符号 , 其中汉字(包括部首和构件)21003个 , 图形符号883个 。


推荐阅读