字符编码 编码转换 乱码

本文探讨了在编码转换过程中遇到的问题,特别是涉及到UTF-8、Unicode和GB编码时的汉字乱码问题。通过示例介绍了如何将UTF-8编码的汉字转换为正确输出,并提到了iconv和宽字符、多字符的转换函数。同时,文章还讲解了有符号数的二进制表示和大小。解决方案包括在存储和读取MySQL数据库时进行正确的编码转换。
摘要由CSDN通过智能技术生成

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值