在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
配置地域化信息。 语法: string setlocale(string category, string locale); 返回值: 字符串 函数种类: 操作系统与环境
本函数用来配置地域的信息。参数 category 有下列的选择:
而参数 locate 若是空字符串 "",则会使用系统环境变量的 locate 或是 LANG 的值。若 locate 为零,则不会改变地域化配置。返回新的地域,若系统尚未实作则返回 false。
单字符宽字符互相转换
#include
size_t mbstowcs(wchar_t *pwcs, const char *s, size_t n); //转换单字符串为宽字符串 size_t wcstombs(char *mbstr, const wchar_t *wcstr, size_t count ); //转换宽字符串为单字符串
例如:
CString str = L"hello";
char sss[20]; wcstombs(sss,str.GetBuffer(),20); //转换宽字符为单字符 stl 宽字符到 单字符转换
wstring str = L"Hello";
std::wstring::size_type len = str.length();
std::string s(len*2,0); size_t total = wcstombs(&s[0],str.c_str(),len*2); s[total] = ''''/0'' return s; mbtowc 和 wctomb 是单个字符相互转换 int len; setlocale (LC_ALL, "chs"); //设置为简体中文环境
wchar_t wc = L''''中'' wprintf(L"1个宽中文字符:%c /n",wc); char* p = "中"; len = mbtowc (&wc, p, MB_LEN_MAX); wprintf(L"单字符串转换为1个宽字符:%c 长度: %d/n",wc,len); char pcmb[MB_LEN_MAX]; len = wctomb (pcmb, wc); pcmb[len] = 0; printf("宽字符转换为单字符串:%s 长度:%d/n",pcmb,len); BYTE utf8[1024]; //utf8 字符串
wchar_t wstr[1024];
char mstr[1024]; //UTF-8 转换为宽字符
MultiByteToWideChar( CP_UTF8, 0, utf8,1024, wstr, sizeof(wstr)/sizeof(wstr[0]) ); WideCharToMultiByte( CP_ACP,0,wstr,-1,mstr,1024,NULL,NULL ); 注:mbstowcs()是C库函数,要正确的设置Locale才能进行转换,MultiByteToWideChar()是win32函数,别搞混了!
为什么一定要调用 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 个。 http://www.voidcn.com/article/p-zvvjuyhw-ra.html
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论