最近在做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");