多字节与宽字符之间的转换问题
2014-07-01 16:14
447 查看
最近在做openssl相关的产品开发。其中遇到取cer证书中用户信息这块,因为用户信息可能是汉字,如用户名、公司名地址等。牵扯到多字节与宽字符Unicode的问题。这些信息在直接取的时候,可能会出现乱码。所以在取的时候,需要做一些操作。
在windows下有两个函数可以进行多字节 <-> 宽字符之间的转换:
MultiByteToWideChar() 和 WideCharToMultiByte(),具体用法百度一下就可得到。
但是在linux下是没有这对函数的。所以需要另一对函数:
size_t mbstowcs(wchar_t *dest, const char *src, size_t n);
和
size_t wcstombs(char *dest, const wchar_t *src, size_t n);
用法百度依然可以得到。
这里需要指出的有两点:
1 wchar_t可以用short来替代。如定义一个short数组:
short dest[100]; 就可以拿来用了。当然传参时,别忘了强转一下(wchar_t*) dest 。
2 mbstowcs的第三个参数n, 表示的是dest数组的大小。此大小至少是src中的实际有效数据的两倍。为啥?看下图:
最后。不同于在windows下使用MultiByteToWideChar()/WideCharToMultiByte(),linux下这两个函数会受locale的影响。所以,在调用它们之前,最好设置一下:
setlocale(LC_ALL,"zh_CN.UTF-8");
在windows下有两个函数可以进行多字节 <-> 宽字符之间的转换:
MultiByteToWideChar() 和 WideCharToMultiByte(),具体用法百度一下就可得到。
但是在linux下是没有这对函数的。所以需要另一对函数:
size_t mbstowcs(wchar_t *dest, const char *src, size_t n);
和
size_t wcstombs(char *dest, const wchar_t *src, size_t n);
用法百度依然可以得到。
这里需要指出的有两点:
1 wchar_t可以用short来替代。如定义一个short数组:
short dest[100]; 就可以拿来用了。当然传参时,别忘了强转一下(wchar_t*) dest 。
2 mbstowcs的第三个参数n, 表示的是dest数组的大小。此大小至少是src中的实际有效数据的两倍。为啥?看下图:
最后。不同于在windows下使用MultiByteToWideChar()/WideCharToMultiByte(),linux下这两个函数会受locale的影响。所以,在调用它们之前,最好设置一下:
setlocale(LC_ALL,"zh_CN.UTF-8");
相关文章推荐
- JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
- 宽字符字符串和多字节字符串之间转换
- MFC 查找宽字节和多字节字符串之间无法转换的字符
- QString和char字符数组之间的转换(QTextCodec.toUnicode方法,特别注意\0的问题)
- JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
- 字节码问题--wchar和char的区别以及wchar和char之间的相互转换字符编码转换等方法及函数介绍
- 多字节和宽字符之间的转换方法
- 宽字符和窄字符之间的转换,以及对中文的处理问题总汇
- C#通过编码在字符和字节之间的转换
- JS中字符问题(二进制/十进制/十六进制之间的转换),颜色进制转换
- JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
- nodejs字符与字节之间的转换
- 字节码问题--wchar和char的区别以及wchar和char之间的相互转换字符编码转换等方法及函数介绍
- 20110831日的总结--关于原始流与字符流之间的转换中的设计问题
- 字符串、流、字节、字符之间的转换
- 多字节字符项目和unicode字符项目之间的转换
- 各种类型字符之间的转换(单字节char*和宽字节wchar_t*,TCHAR和string的转换)
- c++宽字符与多字节之间转换char—wchar,wchar-char
- JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
- JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)