首页IT科技我不再害怕的英文(WCHAR我不再惧怕了 随感而发 C++博客)

我不再害怕的英文(WCHAR我不再惧怕了 随感而发 C++博客)

时间2025-05-28 09:01:32分类IT科技浏览3793
导读:WCHAR我不再惧怕了 宽字符已经困扰我很久了,以前我都是设置项目的属性把它改为多字节,不用UNICODE。不过现在又遇到宽字节的问题,没有办法,只有硬着头皮学学:...

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版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
win10应用商店安装没反应(Win10应用商店下载失败怎么办 应用商店无法正常下载的4种解决方法) 开机需要按f1键怎么解决方法(开机要按F1才能进系统解决办法是什么?)