碶 㯖 这两个字编码上有什么区别吗?

我用UTF8转GBK,用的iconv函数

void TransContent(const char *pFromCode, const char *pToCode, const char *pInBuf, size_t iInLen, char *pOutBuf, size_t iOutLen)
{
    char* sResult = NULL;
    //打开字符集转换
    iconv_t hIconv = iconv_open(pToCode, pFromCode);
    if (!hIconv) return;
    //开始转换
    size_t iRet = iconv(hIconv, (char **)(&pInBuf), &iInLen, &pOutBuf, &iOutLen);
    //关闭字符集转换
    iconv_close(hIconv);
}

TransContent("UTF-8", "GBK//IGNORE", "碶", strlen("碶"), pOutputBuf, sizeof(pOutputBuf));

TransContent("UTF-8", "GBK//IGNORE", "㯖", strlen("㯖"), pOutputBuf, sizeof(pOutputBuf));

碶这个字会被转换为未知字符,㯖这个字会被ignore掉,变成""。
GBK字符集里面这两个字都没有,
为什么一个会被错误转码,一个会被ignore?

ignore是因为识别不了,被转换为"",错误编码是因为系统以为能识别,结果转码错误了。

所以这俩字有啥区别?

https://blog.csdn.net/wang123...

我看这个文章说 碶 这个字 实际上是 碶\

那遇到这种情况该怎么转码呢?

阅读 2.5k
3 个回答

我用 PHP 的两种字符转换库试了一下

iconv 碶
UTF-8
[len] 1
[碶]
[0xE7 0xA2 0xB6]
GBK
// 报错了
iconv 㯖
UTF-8
[㯖]
[0xE3 0xAF 0x96]
[len] 0
GBK
// 没有输出
mbstring 碶
UTF-8
[len] 1
[碶]
[0xE7 0xA2 0xB6]
GBK
[len] 2
[纰] []
[0xE7 0xA2] [0xB6]
mbstring 㯖
UTF-8
[len] 1
[㯖]
[0xE3 0xAF 0x96]
GBK
[len] 2
[惘] []
[0xE3 0xAF] [0x96]

mbstring 两个字都转换了
iconv 一个转成了空,另一个报错了

综合你的代码输出,应该是 iconv 的实现问题,mbstring 就都能转不是么?
印象里看到过相关的文章,两个内部应该都是 查表

试试 Unicode编码

GBK本身有很多汉字没法覆盖的,这个是编码决定的。我在做XML解析的时候遇到过一些生僻字也是这样,后来统一转成GB2312。

以上为错误回答,评论中有纠正。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏