zoukankan      html  css  js  c++  java
  • wchar与char字符转换的探究

    在Xcode 模拟器环境下。測试wchar_t与char的转换:

    void convert_test()
    {
        setlocale(LC_ALL, "zh_CN.UTF-8");
        char*    src_str = "中国";
        wchar_t* src_wstr = L"中国";
        
        char*    dest_str = malloc(32);
        wchar_t* dest_wstr = malloc(32);
        
        mbstowcs(dest_wstr, src_str, mbstowcs(NULL, src_str, 100));
        wcstombs(dest_str, src_wstr, wcstombs(NULL, src_wstr, 100));
        
        free(dest_str);
        free(dest_wstr);
    }

    这里遇到两个疑问:

    1.  字符串存储时的编码格式由什么决定?

    2.  wcstombs()和mbstowcs()这两个函数对编码格式进行了什么样的转换?

    当中。汉字"中“、“国”的编码例如以下:

    GB2312  Unicode  UTF-8       
    D6D0     4E2D       E4 B8 AD  中
    B9FA     56FD       E5 9B BD  国

    第1个问题,依据C/C++编译策略。字符串的编码方式由源文件格式决定(http://www.cppblog.com/lf426/archive/2010/06/25/118707.html)。我们来依据測试结果证实一下:


    当源文件格式是UTF-8时:

     [1]  src_str 内存数据  :    0x0010139e: e4 b8 ad e5 9b bd 00 6c 65 6e 20 3d 20 25 64 0a  .......len = %d.

     [2]  src_wstr 内存数据:    0x00101abc: 2d 4e 00 00 fd 56 00 00 00 00 00 00 01 00 00 00  -N...V..........

     

    当源文件格式是GB2312时:

    [3] src_str在内存中的结果:    0x000b6906: d6 d0 b9 fa 00 6c 65 6e 20 3d 20 25 64 0a 00 63  .....len = %d..c

    [4] GB2312的文件格式下,汉字无法以宽字符的格式保存。编译错误; 


    从上面的结果[1]中能够看到。在UTF-8格式源文件里,以char格式保存的字符串, 从低到高是"e4 b8 ad e5 9b bd",刚好是"中国"的UTF-8编码按字节由低到高存储的格式(不存在字节序的问题); 而[3]中能够看出, char字符串存储的刚好是"中国“的GB2312编码。与源文件格式一致,每字节分开保存(也不存在字节序的问题)。 从[2]中能够看到,wchar_t格式的数据"2d 4e 00 00 fd 56 00 00"刚好是“中国”的Unicode编码,并且是小端格式。 因此。结论是当以char类型保存中文字符的时候,编码式由源文件的编码格式决定;而wchart_t类型的宽字符都以Unicode编码的方式保存; 


    第2个问题, C标准库函数mbstowcs()和wcstombs()对编码转换详细进行了什么操作?依据手冊,我们知道mbstowcs()将char类型的字符串转换成wchart_t类型的字符串,wcstombs()则相反。 由于这两个函数依赖于本地化策略,所以须要先调用setLocale(),首先设置成"zh_CN.UTF-8"格式。得到转换后的数据: 

    [5]  dest_str内存数据: 0x7a946520: e4 b8 ad e5 9b bd d8 01 00 00 93 7a 0d 00 93 7a  ...........z...z

    [6] dest_wstr内存数据:0x7a822b50: 2d 4e 00 00 fd 56 00 00 0e 42 6c 61 63 6b 5f 31  -N...V...Black_1


    从[5]能够看到wcstombs()函数将宽字节表示的"中国"转换后的结果就是其UTF-8编码。 [6]中能够看出,mbstowcs()实际上将UTF-8表示的”中国“转换成了其相应的Unicode编码; 这正好是字符在char类型下的编码方式与wchar_t类型下的编码方式间的相互转换。


    (转载请注明出处:http://blog.csdn.net/codigger/article/details/40711103)



       



  • 相关阅读:
    python使用matplotlib:subplot绘制多个子图 不规则画图
    Python_matplotlib画图时图例说明(legend)放到图像外侧
    python ndarray与pandas series相互转换,ndarray与dataframe相互转换
    用Python实现excel 14个常用操作
    Python中保留两位小数的几种方法
    画图显示中文
    python命名规范
    Alpha阶段小结
    敏捷冲刺每日报告——Day5
    敏捷冲刺每日报告——Day4
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6838069.html
Copyright © 2011-2022 走看看