• 为什么一定要调用 setlocale 呢? 因为在 C/C++ 语言标准中定义了其运行时的字符集环境为 "C" ,也就是 ASCII 字符集的一个子集。使用setlocal改变整个应用程序的字符集编码方式(wcstombs使用前要设置 setlocale (LC_ALL, "chs"); )


    setlocale

    配置地域化信息。

    语法: string setlocale(string category, string locale);

    返回值: 字符串

    函数种类: 操作系统与环境

     
    内容说明

    本函数用来配置地域的信息。参数 category 有下列的选择:

    • LC_ALL 包括下面的全项选项都要。
    • LC_COLLATE 配置字符串比较,PHP 目前尚未实作出来本项。
    • LC_CTYPE 配置字符类别及转换。例如全变大写 strtoupper()
    • LC_MONETARY 配置金融货币,PHP 目前尚未实作。
    • LC_NUMERIC 配置小数点后的位数。
    • LC_TIME 配置时间日期格式,与 strftime() 合用。

    而参数 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
  • 相关阅读:
    APP切换环境
    Cors
    有关JavaScript事件循环的若干疑问探究
    你知道async await的缺陷吗?
    Referrer Policy示例讲解
    HSTS 示例讲解
    解决element ui的zindex问题
    js加载在css前面或后面的示例讲解
    window.name和postMessage跨域详解
    clickjacking的示例讲解
  • 原文地址:https://www.cnblogs.com/findumars/p/10247442.html
Copyright © 2020-2023  润新知