zrui
新手上路
新手上路
阅读:6919回复:14

U+9FB4 - U+9FBB 这8个字在 GB18030 -> Unicode 转换时是不是错了

楼主#
更多 发布于:2017-03-28 22:21
这8个字分别是:龴、龵、龶、龷、龸、龹、龺、龻。
当码表以 GB18030 编码保存时,打这几个字会变成:(U+E81E)、(U+E826)、(U+E82B)、(U+E82C)、(U+E832)、(U+E843)、(U+E854)、 (U+E864)。虽然长得差不多,但后者是专用字符,并非标准,不应使用。(况且“宋体”中, U+9FB5 的字形和 U+E826 的字形并不一样。)
使用 UTF-8 编码则不存在此问题。是不是内置的 GB18030 -> Unicode 映射错了?
在用户码表不能采用 UTF-8 编码的情况下,要把 U+9FB4 - U+9FBB 这些字符放进用户码表是不是无解?
zrui
新手上路
新手上路
沙发#
发布于:2017-03-28 22:39
我用的 Windows 10。
是系统问题的话那也没办法了。libiconv 转换的是对的。
zrui
新手上路
新手上路
板凳#
发布于:2017-03-29 15:15
你说的对。我的码表里的确是 FE59。但:
1. 只有 Windows 把 U+9FB4 编码为 82359037。其他系统中,U+9FB4 的 GB18030 编码都是 FE59。
2. 参考 http://www.fmddlmyy.cn/text24.html。按这篇文章的意思,Windows是对的。
zrui
新手上路
新手上路
地板#
发布于:2017-03-29 15:38
又试了一下,主要问题是 libiconv 会 U+9FB4 <-> FE59,影响了很多软件。
Windows 和(Linux 下的 Python)都是 U+9FB4 <-> 82359037,U+E81E <-> FE59。

我因为用了 vim,它可能用了 libiconv,保存时 U+9FB4 -> FE59,然后小小调用 Windows 的转换,FE59 -> U+E81E。

小小在 Linux 上调用什么做编码转换?同样的码表文件在 Linux 上就是 FE59 -> U+9FB4。

我觉得最好能有个全局选项把默认编码设成 UTF-8 吧,现在操作系统的接口都是 Unicode 的,用 GB18030 + 转换 的办法理论上没什么问题但总是觉得不方便。
zrui
新手上路
新手上路
4楼#
发布于:2017-03-29 21:56
dgod:没有对应编码但同一个汉字在私有区中有回到原帖
我的 vim 设的是 GB18030,不是 GBK。但是看起来 vim 不是用的 Windows 提供的编码转换,而是和 libiconv 一样的。
我总结一下几个软件的编码转换行为吧:
软件
Unicode -> GB18030
GB18030 -> Unicode
9FB4 -> ?
E81E -> ?
FE59 -> ?
82359037 -> ?
Windows / Python
82359037
FE59
E81E
9FB4
libiconv / vim
FE59
FE59
9FB4
9FB4
小小
---
E81E (Windows上)
9FB4 (Linux上)
9FB4
看起来82359037总是可以被正确地解码,所以现在一个变通的办法是避免使用GB18030字符集中的FE59等编码,都用82359037等。
至于E81E等Unicode被吞了,那也没办法了,因为GB18030本来就占用了这些码位。
游客

返回顶部