GB UTF-8 UNICODE 汉字编码表:http://blog.chinaunix.net/uid-25544300-id-3281847.html
1.在使用libjson的过程中遇到的编码问题:
push_back(JSONNode("中文","中文"))存进去的汉字,write()出来全变成了"\u00E6\u009A\u0097\u00E6\u0088\u0098"这种形式。
研究发现 E6 9A 97正是“暗”的UTF-8汉字编码。
“暗”的UNICODE编码是“6697”。std::cout<<"\u6697"<<std::endl和printf("\u6697\n")都会输出“暗”。
那么如何使E6 9A 97输出对应汉字呢?
char ch[] = {0xE6, 0x9A, 0x97, 0x00};
std::cout<<ch<<std::endl和printf("%s\n",ch)输出“暗”
2.
iconv各种转码,宽字符、多字符转换,都解决不了问题,最后用strlen一测,结果是一个“\u00E6”是六个字节,说明做了转义处理。需要自己转码。
3.宽字符、多字符转换:
3.1 宽字符转多字符函数:int wcstombs(char *dest, wchar_t *src, int max)
把src宽字符串转换成普通字符串存储到dest,max表示允许转换到dest的最大字符数。
返回值:成功返回成功转换的普通字符数、转换到dest的普通字符数。失败返回-1,错误码在errno中。
确定dest大小:
int n = wcstombs(NULL, src, 0);
char dest[n+1];
memset(dest, 0, n+1);
3.2 多字符转宽字符函数:int mbstowcs(wchar_t *dest, char *src, int max)
把src普通字符串转换成宽字符串存储到dest,max表示允许转换到dest的最大宽字符数。
返回值:成功返回成功转换的宽字符数、转换到dest的宽字符数。失败返回-1,错误码在errno中。
确定dest大小:
int n = mbstowcs(NULL, src, 0);
wchar_t dest[n+1];
memset(dest, 0, n+1);
3.3 汉字转换:
要加setlocale(LC_ALL,"zh_CN.UTF-8")或者setlocale(LC_ALL,"") ,否则error : Invalid or incomplete multibyte or wide character。