VC的编码:WCHAR的控制台显示问题

23 篇文章 0 订阅
5 篇文章 0 订阅

字符集与编码方案概念:

字符集与编码方案概念分明,却互依互存。字符集与编码方案是配套的。比如提到 GB2312 编码,即是指 GB2312 字符集与 GB2312 编码方案。此处 GB2312 为两字节定长编码。而提到 Unicode 编码,即指 Unicode 字符集与 UTF-X 编码方案。其中 UTF-16 为两字节定长编码,UTF-8 设计为变长是为了工业应用中兼容已有的 ANSI/ASCII 编码,并广泛应用于互联网业务。

总结:

操作系统有一个默认的本地化代码页,在系统安装的时候指定。我国:chs(见附录1)

系统内核使用编码: 默认的编码是:Unicode(utf-16),所以与系统交互式,使用unicode,会加快效率,不需要进行相关的转换。

程序的本地化:程序运行的时候,都有一个默认的codepage,vc控制台程序默认的是C格式。当程序运行的时候,需要与unicode交互时候,都会用到这个codepage,如果这个Codepage和系统的不相同的话,就会出现问题.......

setlocale()的作用和使用例子

当向终端、控制台输出 wchar_t 类型的字符时,需要设置 setlocale(),因为通常终端、控制台环境自身是不支持 UCS 系列的字符集编码的,使用流操作函数时(如:printf()),在标准/RT库实现的内部会将 UCS 字符转换成合适的本地 ANSI 编码字符,转换的依据就是 setlocale() 设定的活动 locale,最后将结果字符序列传递给终端,对于来自终端的输入流这个过程刚好相反。

还有std::basic_iso::imbue()可以设置流的本地化。

Q1、为什么在控制台程序中WCHAR无法输出汉字

A:要回答这个问题,我们需要了解下面几个概念。1、文件编码:我们程序的开发环境为我们把我们的源程序进行编码,这个编码方式我们可以自己设置。2、在vs2010中,编译程序的时候,字符串也有编码,我们系统一般默认支持:unicode和ansi(本地化),本地化字符编码在我们国家默认是chs。还有一个是运行时编码:就是我们的程序中字符显示的编码;

在控制台程序默认选项中:Code page:vc codepage的映射;

例如:cout<<”哎哎”;在编译时期用ansi对其进行编码,显示的时候,系统把它作为一个多字节编码用 ansi进行解码,这样我们的程序显示正常。但是wcout<<L”哎哎”<<”哎哎”;对于L”哎哎”,系统用unicode对其编码,当显示的时候用 C codepage进行映射,然后这四个字节被映射为四个字符,所以出问题了。对于后面的”哎哎”,由于系统它是采用的多字节编码,但是wcout先把它根据(vc codepage)转化成一个unicode编码了,然后根据c-unicode映射表再转化.....正常显示了,无压力;

根据上面的症状是:程序默认的Code page 是C,所以在Unicode需要转化为ansi的时候,映射表选择错了,我们需要做的是更正程序的映射表。用chs;

方案:setlocale(LC_ALL,”chs”);

ANSI C 标准:

Locale 是软件在运行时的语言环境, 它包括语言(Language), 地域 (Territory)和字符集(Codeset). 其格式为: 语言[_地域[.字符集]]. 如对中文GBK字符集, locale的格式是:zh_CN.GBK.  

在locale环境中,有一组变量,代表国际化环境中的不同设置:

1.    LC_COLLATE

定义该环境的排序和比较规则

2.    LC_CTYPE

用于字符分类和字符串处理,控制所有字符的处理方式,包括字符编码,字符是单字节还是多字节,如何打印等。是最重要的一个环境变量。

3.    LC_MONETARY

货币格式

4.    LC_NUMERIC

非货币的数字显示格式

5.    LC_TIME

时间和日期格式

6.    LC_MESSAGES

提示信息的语言。另外还有一个LANGUAGE参数,它与LC_MESSAGES相似,但如果该参数一旦设置,则LC_MESSAGES参数就会失效。LANGUAGE参数可同时设置多种语言信息,如LANGUANE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"。

7.    LANG

LC_*的默认值,是最低级别的设置,如果LC_*没有设置,则使用该值。类似于 LC_ALL。

8.    LC_ALL

它是一个宏,如果该值设置了,则该值会覆盖所有LC_*的设置值。注意,LANG的值不受该宏影响。

C"是系统默认的locale,"POSIX"是"C"的别名。所以当我们新安装完一个系统时,默认的locale就是C或POSIX。不过在安装系统时候让我们选择地域设置,那个东西就是帮助我们选择系统默认的codepage;

附录一:部分codepage

Primary language

Sublanguage

Language string

Chinese

Chinese

"chinese"

Chinese

Chinese (simplified)

"chinese-simplified" or "chs"

Chinese

Chinese (traditional)

"chinese-traditional" or "cht"

Czech

Czech

"csy" or "czech"

Danish

Danish

"dan" or "danish"

Dutch

Dutch (default)

"dutch" or "nld"

Dutch

Dutch (Belgium)

"belgian", "dutch-belgian", or "nlb"

English

English (default)

"english"

English

English (Australia)

"australian", "ena", or "english-aus"

English

English (Canada)

"canadian", "enc", or "english-can"

English

English (New Zealand)

"english-nz" or "enz"

English

English (United Kingdom)

"eng", "english-uk", or "uk"

English

English (United States)

"american", "american english", "american-english", "english-american", "english-us", "english-usa", "enu", "us", or "usa"

Finnish

Finnish

"fin" or "finnish"

French

French (default)

"fra" or "french"

French

French (Belgium)

"frb" or "french-belgian"

French

French (Canada)

"frc" or "french-canadian"

French

French (Switzerland)

"french-swiss" or "frs"

German

German (default)

"deu" or "german"

German

German (Austria)

"dea" or "german-austrian"

German

German (Switzerland)

"des", "german-swiss", or "swiss"

Greek

Greek

"ell" or "greek"

Hungarian

Hungarian

"hun" or "hungarian"

Icelandic

Icelandic

"icelandic" or "isl"

Italian

Italian (default)

"ita" or "italian"

Italian

Italian (Switzerland)

"italian-swiss" or "its"

Japanese

Japanese

"japanese" or "jpn"

Korean

Korean

"kor" or "korean"

Norwegian

Norwegian (default)

"norwegian"

Norwegian

Norwegian (Bokmal)

"nor" or "norwegian-bokmal"

Norwegian

Norwegian (Nynorsk)

"non" or "norwegian-nynorsk"

Polish

Polish

"plk" or "polish"

Portuguese

Portuguese (default)

"portuguese" or "ptg"

Portuguese

Portuguese (Brazil)

"portuguese-brazilian" or "ptb"

Russian

Russian (default)

"rus" or "russian"

Slovak

Slovak

"sky" or "slovak"

Spanish

Spanish (default)

"esp" or "spanish"

Spanish

Spanish (Mexico)

"esm" or "spanish-mexican"

Spanish

Spanish (Modern)

"esn" or "spanish-modern"

Swedish

Swedish

"sve" or "swedish"

Turkish

Turkish

"trk" or "turkish"

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值