How:windows 7 下控制台无法正常显示中文解决

本文详细介绍了在Win7环境下使用mingw GCC编译C程序时显示汉字的问题及解决方案,包括DOS命令CHCP的使用、代码页设置方法以及相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天与樱凌准一起探讨 win7.0 下 mingw  GCC  3.4.5

.

编译的C程序不能显示汉字的问题,现总结如下(备忘):

 

 

#include "stdio.h"

#include "windows.h"
int main( )

   system("chcp 936>NUL");   // 加上这一句就可以了
   char buf[ ]= "中文";
   printf( "显示汉字的测试:%s\n",buf);
   return 0;
}

 

运行结果:

显示汉字的测试: 中文

 ======================================================================================================

DOS命令CHCP简介   功能: 显示或设置活动代码页编号
  CHCP [nnn]
  nnn 指定代码页编号。
  不加参数键入 CHCP 显示活动代码页编号。
  nnn指定一已有的系统字符集,该字符集在CONFIG.SYS文件中由COUNTRY命令定义。
  在DOS下可以通过mode命令来设置代码页。
  选定代码页: MODE CON[:] CP SELECT=yyy
  代码页状态: MODE CON[:] CP [/STATUS]
  按Windows+R组合键,然后输入cmd或者command打开命令提示符。
  比如输入:mode con cp select=936,则表示显示简体中文。如果输入mode con cp select=437,则表示显示MS-DOS 美国英语,而中文显示将会是?。
  MS-DOS为以下国家和语言提供字符集:
  代码页 描述
  1258 越南语
  1257 波罗的语
  1256 阿拉伯语
  1255 希伯来语
  1254 土耳其语
  1253 希腊语
  1252 拉丁 1 字符 (ANSI)
  1251 西里尔语
  1250 中欧语言
  950 繁体中文
  949 朝鲜语
  936 简体中文
  932 日语
  874 泰国语
  850 多语种 (MS-DOS Latin1)
  437 MS-DOS 美国英语
  
应用  当cmd命令行不能显示中文时键入如下命令:
  chcp 936
  即可显示中文了
 
 
//===========================================================================================
代码页简介  
  

  

对于字符和  Unicode 数据的位模式的定义,此模式代表特定字母、数字或符号(例如 0x20 代表一个空格,而 0x74 代表字符“t”)。一些 数据类型每个字符使用一个 字节;每个字节可以具有 256 个不同的位模式中的一个模式。
  在计算机中,字符由不同的位模式(ON 或 OFF)表示。每个字节有 8 位,这 8 位可以有 256 种不同的 ON 和 OFF 组合模式。对于使用 1 个字节存储每个字符的程序,通过给每个位模式指派字符可表示最多 256 个不同的字符。2 个字节有 16 位,这 16 位可以有 65,536 种唯一的 ON 和 OFF 组合模式。使用 2 个字节表示每个字符的程序可表示最多 65,536 个字符。  单字节代码页  单字节代码页是字符定义,这些字符映射到每个字节可能有的 256 种位模式中的每一种。代码页定义大小写字符、数字、符号以及 !、@、#、% 等特殊字符的位模式。每种欧洲语言(如德语和西班牙语)都有各自的单字节代码页。虽然用于表示 A 到 Z 拉丁字母表字符的位模式在所有的代码页中都相同,但用于表示重音字符(如"é"和"á")的位模式在不同的代码页中却不同。如果在运行不同代码页的计算机间交换数据,必须将所有字符数据由发送计算机的代码页转换为接收计算机的代码页。如果源数据中的扩展字符在接收计算机的代码页中未定义,那么数据将丢失。如果某个数据库为来自许多不同国家的客户端提供服务,则很难为该数据库选择这样一种代码页,使其包括所有客户端计算机所需的全部扩展字符。而且,在代码页间不停地转换需要花费大量的处理时间。  双字节代码页  仅靠单字节字符集存储许多语言所使用的字符也是不够的。例如,一些亚洲语言包含上千个字符,所以每个字符必须使用双字节。双字节字符集正是为这些语言定义的。但是,这些语言都有各自的代码页,在运行不同双字节代码页的计算机之间传输数据也存在困难。
代码页  代码页 描述
  1258 越南语
  1257 波罗的语
  1256 阿拉伯语
  1255 希伯来语
  1254 土耳其语
  1253 希腊语
  1252 拉丁 1 字符 (ANSI)
  1251 西里尔语
  1250 中欧语言
  950 繁体中文
  949 朝鲜语
  936 简体中文
  932 日语
  874 泰国语
  850 多语种 (MS-DOS Latin1)
  437 MS-DOS 美国英语
Unicode 标准  为解决在网络中支持多种代码页时出现的字符转换和解释问题,ISO 标准化组织和称为 Unicode Consortium 的团体定义了 Unicode 标准。Unicode 使用双字节存储每个字符。由于 65,536 个字符足以涵盖世界上所有语言常用的字符,因此 Unicode 标准适用于所有的主要语言。如果网络中的所有计算机和程序都使用 Unicode,则无需进行任何字符转换,每个用户与所有其它用户看到的字符完全相同,并且不会丢失任何字符。
  在运行 Microsoft Windows® 操作系统的计算机上,操作系统和 Windows 应用程序使用的代码页由 Windows 区域设置定义。区域设置是在安装操作系统时选择的。Windows 应用程序使用由 Windows 区域设置定义的代码页来解释数据。Windows 应用程序还支持宽字符数据,即 Unicode 数据。
 
SQL Server 2000相关  支持两类字符数据类型:  Unicode 数据类型  nchar、nvarchar 和 ntext。这些数据类型使用 Unicode 字符表示法。代码页不适用于这些数据类型。  非 Unicode 字符数据类型  char、varchar 和 text。这些数据类型使用单字节或双字节代码页中定义的字符表示法。
  有关字符数据的存储方式以及代码页、Unicode 和排序次序操作的更多信息,请参见在  [1]  MSDN® 页中的 Developing International Software for Windows 95 and Windows NT 4.0。  国际化数据和 Unicode  当只使用字符数据和代码页时,在一个数据库内很难以多种语言存储数据。很难为数据库找到一种代码页,能够存储所需全部语言特有的字符。对于运行各种代码页的不同客户端所读取和更新的特殊字符,要确保正确地转换也很困难。支持国际化客户端的数据库应始终使用 Unicode 数据,而不应使用非 Unicode 数据类型。
  例如,北美洲客户的数据库必须处理三种主要语言:
  墨西哥使用的西班牙文名称和地址。
  魁北克使用的法文名称和地址。
  加拿大的其余地区和美国使用的英文名称和地址。
  当只使用字符列和代码页时须小心,以确保数据库所安装的代码页能够处理这三种语言的字符。当其中一种语言的字符由运行另一种语言的代码页的客户端读取时,必须更加小心以确保能够正确转换字符。
 
//=====================================================================
设置代码页的方法 通过DOS命令  在DOS下可以通过mode命令来设置代码页。
  选定代码页: MODE CON[:] CP SELECT=yyy
  代码页状态: MODE CON[:] CP [/STATUS]
  按Windows+R组合键,然后输入cmd或者command打开命令提示符。
  比如输入:mode con cp select=936,则表示显示简体中文。如果输入mode con cp select=437,则表示显示MS-DOS 美国英语,而中文显示将会是?。  通过C语言函数  方法一:
  通过 system函数调用dos命令,该函数的头文件是stdlib.h。
  例: system("mode con cp select=936");
  方法二:
  通过API函数SetConsoleOutputCP来实现( VC 2008下测试通过  , GCC 3.4.5 未通过 ) 
  程序例:
  #include <windows.h>
  #include <stdio.h>
  int main( void )
  {
  SetConsoleOutputCP(936);
  printf("简体中文\n");
  return 0;
  }
  输出:
  简体中文
  Press any key to continue
  如果将代码页设置为437,那么无法正常输出简体中文:
  ╝≥╠σ╓╨╬─
  Press any key to continue
现状  随着 Internet 的发展,支持众多运行不同区域设置的客户端计算机变得日益重要。很难选择这样一种代码页,使其包含的字符数据类型能够支持全球范围用户所需的全部字符。
  管理国际化数据库中的字符数据的最简单方法是始终使用 Unicode nchar、nvarchar 和 ntext 数据类型,代替对应的非 Unicode 数据类型(char、varchar 和 text)。如果所有使用国际化数据库的应用程序也采用 Unicode 变量而不是非 Unicode 变量,那么在系统中的任何地方都无须进行字符转换。每个客户端与所有其它客户端看见的字符数据都完全相同。
  对于可使用单字节代码页的系统,Unicode 数据需要的存储空间是非 Unicode 字符数据的两倍,但却消除了在代码页间转换扩展字符的必要,因此至少部分弥补了上面的不足。使用双字节代码页的系统没有这个问题。
  SQL Server 2000 将所有的文本化系统目录数据都存储在包含 Unicode 数据类型的列中。数据库对象(如表、视图和存储过程)的名称存储在 Unicode 列中。这样就可以只使用 Unicode 开发应用程序,从而避免了所有的代码页转换问题。
  排序次序
  排序次序指定 SQL Server 解释、排序、比较和显示字符数据所使用的规则。例如,排序次序定义"a"是小于、等于还是大于"b"。排序次序定义排序规则是否区分大小写,例如"m"和"M"是否相同。另外还定义排序规则是否区分重音,例如"á"和"&auml;"是否相同。
  SQL Server 2000 对每种排序规则使用两种排序次序,一种用于 Unicode 数据,另一种用于字符代码页。
  许多 SQL Server 排序规则使用相同的代码页,但是代码页的排序次序不同。这使站点得以选择:
  是否仅根据位模式所表示的数字值来排序字符。二进制排序的速度最快,这是因为 SQL Server 不用做任何调整并可使用快速、简单的排序算法。二进制排序次序始终区分大小写。由于代码页中的位模式可能不按照特定语言的字典规则所定义的序列排列,二进制排序有时并不按照使用该语言的用户所期待的序列对字符进行排序。
 
// ---------------------------
要查看本地计算机上可用的代码页,
它保存在注册表的  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
项目下
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值