阅读:9527回复:14
U+9FB4 - U+9FBB 这8个字在 GB18030 -> Unicode 转换时是不是错了
这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 这些字符放进用户码表是不是无解? |
|
地板#
发布于:2017-03-29 10:00
测了一下xp下没这个问题,网页版和linux表现符合预期,手上没有win10,暂时无法测试。你先检查一下你码表中的这几个字的编码是否就已经有问题了。
|
|
5楼#
发布于:2017-03-29 13:48
u+9fb4对应的gb编码应该是282359037
u+e81e对应的gb编码应该是fe59 很怀疑你码表中的编码就已经是fe59了 |
|
6楼#
发布于:2017-03-29 15:15
你说的对。我的码表里的确是 FE59。但:
1. 只有 Windows 把 U+9FB4 编码为 82359037。其他系统中,U+9FB4 的 GB18030 编码都是 FE59。 2. 参考 http://www.fmddlmyy.cn/text24.html。按这篇文章的意思,Windows是对的。 |
|
7楼#
发布于: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 + 转换 的办法理论上没什么问题但总是觉得不方便。 |
|
8楼#
发布于:2017-03-29 20:34
|
|
9楼#
发布于:2017-03-29 20:40
除了上面楼主说的那 8 个字符(实际上一共有 14 个),
在 Windows 里是严格按 GB18030 规范,和 GBK 一样,继续映射到 Unicode 的私用区, 而在 libiconv 里,是和其他几十个有俩 Unicode 编码的字符一样,优先使用了非私用区的编码, 这个冲突点之外,小小输入法好像还有一个问题? 貌似小小用 UTF-8 格式的码表,在非 Windows 环境下,打不出 Unicode 私用区编码的字符。 在码表里,不管是私用区的编码,还是后来收录的非私用区的编码, 在小小内部的 GB18030 编码里,都会被映射到非私用区对应的那个 GB 编码上,被输出出来。 也就是说你在 Linux、Android 上用 UTF-8 的码表可能打不出 U+E81E 这些字符。 可以看成 Unicode 私用区的那个字符丢失了,被替换成了对应的非私用区的字符。 --- GB18030 是大陆推荐的规范,编码空间够大,很多软件也都支持了, 但不管怎样,也是不如国际规范 Unicode 获得的支持更广泛。 平时接触的各种东西也是用 UTF-8 的比较多。 GB18030 在功能上确实一点不差,在大陆常用字范围内用起来也挺爽, 但我和楼主有同感,在有些场合下,觉得还是不如 UTF-8 方便。 为了所谓的「更通用性」,就要在小小这边的主码表坚持使用 UTF-8, 因为不能用码表优化功能(会变成 GB18030),(不然也不想用,不同内容分段摆(非纯按编码排序)会乱掉。) 也就不能用添删词、调序、用户词库的功能。 这意味着想添删改词、调序时,全部要打开码表文件手动编辑。 因为分词库不支持 UTF-8,所以也不能用。 总之现在采用的是这套方案。 |
|
上一页
下一页