在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)

wchar与char字符转换的探究的更多相关文章

  1. 自己写unicode转换ascii码,wchar*到char*

    对于ascii码的char事实上就是unicode码wchar的首个字节码, 如wchar[20] = "qqqq"; 在内存中排码事实上是char的'q' '\0'这类.因此我们 ...

  2. CString string char* char 之间的字符转换(多种方法)

    在写程序的时候,我们经常遇到各种各样的类型转换,比如 char* CString string 之间的互相转换.首先解释下三者的含义. CString 是一种很有用的数据类型.它们很大程度上简化了MF ...

  3. C++ 宽字符(wchar_t)与窄字符(char)的转换

    了解 长度 宽字符wchar_t的长度16位,可以用来显示中文等除英文外的其他文字, 窄字符    char   的长度  8 位,只能处理英文. 哪里可以见到 在VS2010, 2012, 2013 ...

  4. vc++字符转换

    测试环境: vs2008 开发语言:C++ #include <iostream>#include <windows.h>#include <string> // ...

  5. mfc Unicode转 ASNI ,WCHAR 转 CHAR

    知识点: 宽字符转多字节字符 多字节字符转宽字符 什么是ANSI,什么又是UNICODE呢?其实这是两种不同的编码方式标准,ANSI中的字符采用8bit,而UNICODE中的字符采用16bit 在VC ...

  6. CString char BSTR 转换

     关于字符集不一的历史原因,可以参考: UNICODE与ANSI的区别 以下是网上转载的资料.我将辅以自己的实例,说明并总结关系. 一.CString, int, string, char*之间的转换 ...

  7. 通过编写串口助手工具学习MFC过程——(三)Unicode字符集的宽字符和多字节字符转换

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  8. 带毫秒的字符转换成时间(DateTime)格式的通用方法

    C#自身有更好的方式,Net任意String格式转换为DateTime类型 ====================================================== 原文 ==== ...

  9. sql字符转换函数大全

    删除空格 有两个函数,TTRIM()和LTRIM(),可以用来从字符串中剪掉空格.函数LTRIM()去除应该字符串前面的所有空格:函数RTRIM()去除一个字符串尾部的所有空格.这些和vbscript ...

随机推荐

  1. 简化调用Web Service

    年前在客户那里做POC,因为成型的OTMCS暴露Web Service的Schema太长,导致ICS无法支持和映射,讨论过后决定对Web Service调用进行封装,因OTMCS WebService ...

  2. JavaScript破解验证码

    现在,Megaupload站点提供的CAPTCHA在上述代码面前已经败下阵来,说实话,这里的验证码设计的不不太好.但更有趣的是: 1.HTML 5中的Canvas应用程序接口getImageData可 ...

  3. idea Tomcat 部署 war和war exploded的区别

    idea Tomcat 部署 war和war exploded的区别 学习了:https://blog.csdn.net/linjpg/article/details/73322881 explode ...

  4. hdoj-1213-How Many Tables【并查集】

    How Many Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...

  5. 详解CSS的相对定位和绝对定位(讲得很详细)

    详解CSS的相对定位和绝对定位 CSS的相对定位和绝对定位通常情况下,我们元素的position属性的值默认为static 就是没有定位,元素出现在正常的文档流中,,这个时候你给这个元素设置的left ...

  6. iOS学习笔记-地图MapKit入门

    代码地址如下:http://www.demodashi.com/demo/11682.html 这篇文章还是翻译自raywenderlich,用Objective-C改写了代码.没有逐字翻译,如有错漏 ...

  7. [1-3] 把时间当做朋友(李笑来)Chapter 3 【提高心智,和时间做朋友】 摘录

    1. 精确感知时间 我有个朋友叫做时间.她跟我真可算作两小无猜,默默陪了二十多年我才开始真正认识她.她原本没有面孔,却因为我总是用文字为她拍照,而因此可以时常伴我左右.她原本无情,我却可以把她当作朋友 ...

  8. node-webkit 开发环境搭建

    node-webkit支持的操作系统类型: Linunx:32bit / 64bit Windows: win32 Mac:32bit,10.7+ 开发环境 1,根据自己的操作系统下载响应的nw二进制 ...

  9. rtp协议详解/rtcp协议详解

    转自:http://www.cnblogs.com/li0803/archive/2010/11/20/1882792.html 1.简介 目前,在IP网络中实现实时语音.视频通信和应用已经成为网络应 ...

  10. 【C语言天天练(二三)】errno变量

    引言: 在C编程中,errno是个必不可少的变量.特别是在网络编程中. 假设你没实用过errno,那仅仅能说明你的程序不够健壮. 为什么会使用errno呢?这是系统库设计中的一个无奈之举.他很多其它的 ...