字符集与编码方案概念:
字符集与编码方案概念分明,却互依互存。字符集与编码方案是配套的。比如提到 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" |