2012-02-10 20:36:02|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 字符处理, 文件操作|来源:唯设编程网
CStdioFile默认无法向文件中写入中文字符,如以下代码文件以CStdioFile向文本中写入中文,但是用notepad.exe查 看不到写入的中文
CStdioFile file; file.Open(…); file.WriteString(_T("abc你好"));//只能写入abc
解决办法:
使用setlocale语句设定区域
#include <locale>//头文件 CStdioFile file; file.Open(…); char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) ); setlocale( LC_CTYPE, "chs" );//设定 file.WriteString(_T("abc你好"));//正常写入 setlocale( LC_CTYPE, old_locale ); free( old_locale );//还原区域设定
简化处理可以仅使用语句setlocale( LC_CTYPE, "chs" )。
setlocale函数说明:
函数原形为:char *setlocale( int category, const char *locale );
包含的头文件:<locale.h>
所支持的操作系统为:ANSI, Win 95, Win NT
对于简体中文可以使用如下设置:setlocale( LC_ALL, "chs" );
为什么一定要调用setlocale呢?
因为在C/C++语言标准中定义了其运行时的字符集环境为"C",也就是ASCII字符集的一个子集,那么mbstowcs在工作时会将cstr中所包含 的字符串看作是ASCII编码的字符,而不认为是一个包含有chs编码的字符串,所以他会将每一个中文拆成2个ASCII编码进行转换,这样得到的结果就 是会形成4个wchar_t的字符组成的串,那么如何才能够让mbstowcs正常工作呢?在调用mbstowcs进行转换之间必须明确的告诉 mbstowcs目前cstr串中包含的是chs编码的字符串,通过setlocale( LC_ALL, "chs" )函数调用来完成,需要注意的是这个函数会改变整个应用程序的字符集编码方式,必须要通过重新调用setlocale( LC_ALL, "C" )函数来还原,这样就可以保证mbstowcs在转换时将cstr中的串看作是中文串,并且转换成为2个wchar_t字符,而不是4个。
本地化设置需要具备三个条件:
a. 语言代码 (Language Code)
b. 国家代码 (Country Code)
c. 编码(Encoding)
本地名字可以用下面这些部分来构造:
语言代码_国家代码.编码 比如(zh_CN.UTF-8, en_US等)
setlocale语言字符串参考
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 (Belgian) | "belgian", "dutch-belgian", or "nlb" |
English | English (default) | "english" |
English | English (Australian) | "australian", "ena", or "english-aus" |
English | English (Canadian) | "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 (Belgian) | "frb" or "french-belgian" |
French | French (Canadian) | "frc" or "french-canadian" |
French | French (Swiss) | "french-swiss" or "frs" |
German | German (default) | "deu" or "german" |
German | German (Austrian) | "dea" or "german-austrian" |
German | German (Swiss) | "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 (Swiss) | "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 (Brazilian) | "portuguese-brazil" or "ptb" |
Russian | Russian (default) | "rus" or "russian" |
Slovak | Slovak | "sky" or "slovak" |
Spanish | Spanish (default) | "esp" or "spanish" |
Spanish | Spanish (Mexican) | "esm" or "spanish-mexican" |
Spanish | Spanish (Modern) | "esn" or "spanish-modern" |
Swedish | Swedish | "sve" or "swedish" |
Turkish | Turkish | "trk" or "turkish" |
setlocale国家字符串参考
Country/Region | Country/Region string |
Australia | "aus" or "australia" |
Austria | "aut" or "austria" |
Belgium | "bel" or "belgium" |
Brazil | "bra" or "brazil" |
Canada | "can" or "canada" |
China | "china", "chn", "pr china", or "pr-china" |
Czech Republic | "cze" or "czech" |
Denmark | "dnk" or "denmark" |
Finland | "fin" or "finland" |
France | "fra" or "france" |
Germany | "deu" or "germany" |
Greece | "grc" or "greece" |
Hong Kong SAR | "hkg", "hong kong", or "hong-kong" |
Hungary | "hun" or "hungary" |
Iceland | "iceland" or "isl" |
Ireland | "irl" or "ireland" |
Italy | "ita" or "italy" |
Japan | "jpn" or "japan" |
Korea | "kor" or "korea" |
Mexico | "mex" or "mexico" |
The Netherlands | "nld", "holland", or "netherlands" |
New Zealand | "nzl", "new zealand", "new-zealand", or "nz" |
Norway | "nor" or "norway" |
Poland | "pol" or "poland" |
Portugal | "prt" or "portugal" |
Russia | "rus" or "russia" |
Singapore | "sgp" or "singapore" |
Slovakia | "svk" or "slovak" |
Spain | "esp" or "spain" |
Sweden | "swe" or "sweden" |
Switzerland | "che" or "switzerland" |
Taiwan | "twn" or "taiwan" |
Turkey | "tur" or "turkey" |
United Kingdom | "gbr", "britain", "england", "great britain", "uk", "united kingdom", or "united-kingdom" |
United States | "usa", "america", "united states", "united-states", or "us" |