我不再害怕的英文(WCHAR我不再惧怕了 随感而发 C++博客)
WCHAR我不再惧怕了
宽字符已经困扰我很久了 ,以前我都是设置项目的属性把它改为多字节 ,不用UNICODE 。不过现在又遇到宽字节的问题 ,没有办法 ,只有硬着头皮学学:
我找到的资料:
http://hi.baidu.com/shongbee2/blog/item/207925546b6cdd5fd10906e0.html
http://hi.baidu.com/shongbee2/blog/item/d4a057511e9539878c5430cb.html
看了之后我才发现原来有wcsXXX的函数专门处理宽字节的 ,就是strXXX一样好使 。呵呵 ,我不再惧怕了 ,就试着自己写了一下 ,还是学了蛮多东西的:
1.有wcsXXX的函数和strXXX的函数对应处理宽字节 ,wcslen就是求长度的 ,wcscmp就是比较两个字符串的 。
2.输出也有相关的操作 ,wprintf(L ”%s%s ”);这样的操作 ,对文件也可以用fwprintf函数来输出 。不过我发现貌似cout << wchar;不成功 。也发现了一个问题,就是我输出 ”相等 ”这样一个字符串的时候 ,发现居然输出不正确 ,无论是控制台和文件都有错误 。可见,这个还是有点小问题的 。输出其他的例如 ”12345 ”等都是正常的 。哎 ,这个函数并不可靠啊 。
3.宽字节和普通串的转换问题 ,学了两个函数 ,一个是:
wcstombs(char* strDes, const wchar*, size_t nMax);这个函数的作用是把wchar转换为char 。
char* strDes 为保存转换后的普通字符串 ,wchar* 要被转换的宽字符串 。转换的最大长度 。这里的长度是转换的个数 ,而不是字节长度。
mbstowcs() 就是一个相反的过程了 ,参数就不说了 。另一套转换的函数是:
int WideCharToMultiByte(
UINT CodePage,
DWORD dwFlags,
LPCWSTR lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCSTR lpDefaultChar,
LPBOOL lpUsedDefaultChar
);
他的参数很多 ,上面的连接有介绍 ,这里就不怎么细说了 。
第一个是编码的方式 ,我一般用CP_ACP。第二个是转换标志 ,MSDN上说什么都不设置更快 ,然后我就什么都不管了就用NULL了 。具体作用不知道 ,等遇到了再学 。第三个参数就是被转换的字符串,第四个参数是该字符串的长度 ,-1表示自动算长度 ,如果是手动给出,一定要把最后的终结符长度也算上 。我觉得还是-1来的实际 。第五个参数就是保存转换串的指针 ,第六个参数就是保存串的长度 ,这里是单位字符的个数 。如果转换的时候没有终结符 ,那么结果也没有终结符 ,要注意下 。最后两个参数就是默认的填充字符和是否使用了默认填充字符 ,我一般就用NULL代替 。普通串转宽字节也是类似 。
这里有几个注意的 ,一定要保证空间足够 。还有就是那个长度是单位字符个数 ,而不是字节数 ,在转换时 ,推荐被转换的字符串长度设置为-1,因为这样他会自动算出终结符结束 。返回值也是转换的单位字符个数 。例如 ”相等 ”有普通串转换为宽字节串 ,返回结果是3 ,(有终结符) ,而反过来就是5 。如果返回时0 说明转换失败。心得:虽然WideCharToMultiByte的参数要多,感觉用的没有wcstombs爽 ,可是他的准确好高一些 ,要转换的话,还用用WideCharToMultiByte比较合适 ,还有就是虽然有一套wcsXXX的库函数 ,可惜输出还是出现问题的 。如果全都用宽字节 ,那没有关系wcsxxx的函数还是蛮好用的 。还有一个疑惑我明明查字典multi是多的意思也就是说multibyte是多字节 ,我的中文版VS2005配置里面也是说的多字节。搞不懂为什么要用宽字节呢?可能是多字节编码不好用吧 。呵呵 。 废话也说完了 ,奉上源代码:
不要脸的再次放入精华区 ,因为我觉得他困扰我太久了 。呵呵
posted on 2009-04-28 20:09 shongbee2 阅读(10808) 评论(15) 编辑收藏 引用 所属分类: COM相关
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!