同一个汉字 ,却不同编码,所带来的麻烦。

系统字体配置、中文显示和输入法问题
回复
头像
yq-ysy
论坛版主
帖子: 4467
注册时间: 2008-07-19 12:44
来自: 广西(桂)南宁(邕)

同一个汉字 ,却不同编码,所带来的麻烦。

#1

帖子 yq-ysy » 2021-07-12 12:45

代码: 全选

六六
上面这两个汉字,有什么区别吗?
有些浏览器看不出来(复制也一样),有些浏览器能看出来(复制有不同):
中间的一横,位置、大小,在点不一样。
但是,也只有把这两个字放在一起比较时,才能看到这细微差别。
如果把这一个字单独放在一句话里,就很难分辨。

——————————————————

最近,我在继续整理“HTML5格式佛经”,完成了《六祖坛经》的编排,
一如既往,修改 目录.html 文件,然后用浏览器打开,点击链接测试,
问题出现了,浏览器找不到文件?

打开文件夹,再次确认:六祖坛经.html 文件存在呀!
文件名也再次检查了一遍,没有多余的空格。
又再一次检查了 html 源文件里的链接标签,没写错。
为了保险起见,再次选中这个文件,进入“重命名”的编辑状态,选中文件名,
Ctrl C 复制文件名,Ctrl V 粘贴到 目录.html 文件的代码里,这样总不会错了吧?
保存,测试,还是提示找不到文件。

难道是磁盘有问题,出现坏道的前兆?
于是,直接在文件夹里,把 六祖坛经.html 文件拖到浏览器里,能正常打开。
那为什么点击 目录.html 文件里的链接,说找不到文件?
浏览器的地址栏里,也能正常显示中文路径,反复查看比较:
点击链接的路径,和直接拖拽文件的路径,一模一样,也没错呀?

突然想到,以前旧版浏览器的地址栏里,中文路径都是用一大堆%百分号显示的,
现在新版浏览器升级了,地址栏能正常显示中文了,难道是浏览器的中文编码转换问题?
为了验证这一想法,
于是:把“点击链接”和“文件拖拽”两种操作,在浏览器的地址栏里的路径,
复制粘贴到一个文本编辑器里,果然看到了不同,如下所示:

代码: 全选

FireFox直接打开网页文件,地址栏显示中文正常,复制过来得到的代码:
file:///home/abc/%E6%96%87%E6%A1%A3/H5_FoJing/FoJing_HTML5/%EF%A7%91%E7%A5%96%E5%9D%9B%E7%BB%8F.html
FireFox点击“目录”网页链接,地址栏显示中文正常,复制过来得到的代码:
file:///home/abc/%E6%96%87%E6%A1%A3/H5_FoJing/FoJing_HTML5/%E5%85%AD%E7%A5%96%E5%9D%9B%E7%BB%8F.html
果然是编码有问题!而且确定,问题就出在“六”这个字上。
“六祖坛经”这几个字,都是常见字,不是生僻字,理论上应该不会错的啊?
虽然我早就知道,同一个汉字,在Unicode编码里,会重复出现几次(日韩港台大陆,分别提交的),
造成一个汉字,即使字形完全相同,也有多个编码不同的情况。
参阅以前的帖子:
https://forum.ubuntu.org.cn/viewtopic.p ... 2#p3225832
https://forum.ubuntu.org.cn/viewtopic.p ... 1#p3226091
但 目录.html 文件里的链接,我是用文件名复制过去的,应该是同一个字,编码也应该不变啊。
难道还要强制指定浏览器的编码,才能正常看网页?事情不应该那么麻烦的。

又仔细回想,我最早在创建这个文件时,当时懒得打文件名,就从某个PDF文件上复制粘贴过来的,
难道是个原因?
抱着试一试的想法,就手动修改文件名,用输入法重新打了一次“六”字,
把 六祖坛经.html 改成 六祖坛经.html
注意:此时我没有修改 目录.html 文件里的链接。
现在,用浏览器打开 目录.html 文件,点击链接,终于成功打开 六祖坛经.html 文件了!

原来问题出在这里!文件名的“六”不是国标汉字的“六”,
但是我把这个非国标的“六”复制到文本编辑器(Kwrite)里之后,
文本编辑器太智能了,自动转换成国标的“六”,所以造成 Html 地址编码与文件名不一致。
而浏览器也太智能了,在地址栏显示的都是正确的中文,害我一时半会找不到原因。

“六”和“六”两个字的编码不同,再次列出如下。

代码: 全选

非国标的 “六”:UTF-8编码:六 Unicode编码:\uf9d1 Hex编码:%EF%A7%91
 国标的 “六”:UTF-8编码:六 Unicode编码:\u516d Hex编码:%F5%85%AD
最后,这事,体现了统一用国标的重要性,偷懒一点都有可能出问题。
文件下载地址:
H5佛经2021-07-12.zip
(1.11 MiB) 已下载 79 次
网页在线浏览: https://yq-ysy.github.io/H5_FoJing/
头像
astolia
论坛版主
帖子: 6539
注册时间: 2008-09-18 13:11

Re: 同一个汉字 ,却不同编码,所带来的麻烦。

#2

帖子 astolia » 2021-07-12 21:13

yq-ysy 写了: 2021-07-12 12:45

代码: 全选

六六
上面这两个汉字,有什么区别吗?
没区别,这就是两个相同的字,也就是unicode编码为516D的那个
yq-ysy 写了: 2021-07-12 12:45 虽然我早就知道,同一个汉字,在Unicode编码里,会重复出现几次(日韩港台大陆,分别提交的),
这个认知是错误的,并非简单的不同方提交就赋予不同的编码,而是有一定的合并/独立编码的原则在。参考 https://zh.wikipedia.org/wiki/%E4%B8%AD ... F%E5%89%87
yq-ysy 写了: 2021-07-12 12:45 造成一个汉字,即使字形完全相同,也有多个编码不同的情况。
不会的。你遇到的字形完全相同,极大概率是所使用的字体文件在制作时偷懒了或者字号太小难以分辨
yq-ysy 写了: 2021-07-12 12:45 “六”和“六”两个字的编码不同,再次列出如下。

代码: 全选

非国标的 “六”:UTF-8编码:六 Unicode编码:\uf9d1 Hex编码:%EF%A7%91
 国标的 “六”:UTF-8编码:六 Unicode编码:\u516d Hex编码:%F5%85%AD
这里又是个认知上的错误。&#xF9D1不是UTF-8编码,%EF%A7%91也不是什么Hex编码。Unicode编码U+F9D1或者你写的\uf9d1,在UTF-8中的编码就是EFA791。%EF%A7%91这种只是对UTF-8编码数据的百分号编码(https://zh.wikipedia.org/zh-hans/%E7%99 ... 6%E7%A0%81)而已,因为你文件系统中文件名采用的正是UTF-8编码
yq-ysy 写了: 2021-07-12 12:45 最后,这事,体现了统一用国标的重要性,偷懒一点都有可能出问题。
这个可体现不出来。这件事实质上就是你在制作的时候缺乏一致性,没有把复制的文字同样用到链接里,和用不用国标关系不大。软件行业对文件名编码的兼容性问题上,早有共识只用ASCII编码中的可打印字符部分,否则要在某些非中文环境的系统上,你这个zip文件包解压一样会把文件名搞出问题。

另外顺便提一下,在html文件里指定字符集,简单的用<meta charset="utf-8"/>就行了。你用的在content里指定charset的方法虽然繁杂了点,本来也没错,但是你多加了个引号,导致整个声明实际上是无效的。之所以除了IE以外的浏览器还能正常显示,只是因为它们默认就是用utf8编码
头像
yq-ysy
论坛版主
帖子: 4467
注册时间: 2008-07-19 12:44
来自: 广西(桂)南宁(邕)

Re: 同一个汉字 ,却不同编码,所带来的麻烦。

#3

帖子 yq-ysy » 2021-07-13 0:15

astolia 写了: 2021-07-12 21:13
yq-ysy 写了: 2021-07-12 12:45

代码: 全选

六六
上面这两个汉字,有什么区别吗?
没区别,这就是两个相同的字,也就是unicode编码为516D的那个
yq-ysy 写了: 2021-07-12 12:45 造成一个汉字,即使字形完全相同,也有多个编码不同的情况。
不会的。你遇到的字形完全相同,极大概率是所使用的字体文件在制作时偷懒了或者字号太小难以分辨
不知道怎么回事,我复制粘贴进论坛的文本框,就会自动被转换为国标编码的“六”。
不知道是操作系统完成的转换?还是网站论坛完成的转换?反正发表后就变成了一样的编码。
但如果复制到 FireFox 的搜索框里,显示就能看出区别了。(如下图所示)
66.png
astolia 写了: 2021-07-12 21:13
yq-ysy 写了: 2021-07-12 12:45 虽然我早就知道,同一个汉字,在Unicode编码里,会重复出现几次(日韩港台大陆,分别提交的),
这个认知是错误的,并非简单的不同方提交就赋予不同的编码,而是有一定的合并/独立编码的原则在。参考 https://zh.wikipedia.org/wiki/%E4%B8%AD ... F%E5%89%87
原来如此,谢谢指正。
对不起读者,是我想当然了,误导别人了。
astolia 写了: 2021-07-12 21:13
yq-ysy 写了: 2021-07-12 12:45 “六”和“六”两个字的编码不同,再次列出如下。

代码: 全选

非国标的 “六”:UTF-8编码:&#xF9D1; Unicode编码:\uf9d1 Hex编码:%EF%A7%91
 国标的 “六”:UTF-8编码:&#x516D; Unicode编码:\u516d Hex编码:%F5%85%AD
这里又是个认知上的错误。&#xF9D1不是UTF-8编码,%EF%A7%91也不是什么Hex编码。Unicode编码U+F9D1或者你写的\uf9d1,在UTF-8中的编码就是EFA791。%EF%A7%91这种只是对UTF-8编码数据的百分号编码(https://zh.wikipedia.org/zh-hans/%E7%99 ... 6%E7%A0%81)而已,因为你文件系统中文件名采用的正是UTF-8编码
原来如此,谢谢指正。
我之所以把这些都叫做“xx编码”,是因为我使用“站长工具 > Unicode编码转换”这个网页进行编码查询和转换,
http://tool.chinaz.com/Tools/unicode.aspx
它上面就全都称之为“xx编码”,所以我就复制过来了。
想必普通读者也不大懂,不知道专业的术语应该怎么称呼,凡是看到带字母和数字的,都一律称之为“编码”了。
astolia 写了: 2021-07-12 21:13
yq-ysy 写了: 2021-07-12 12:45 最后,这事,体现了统一用国标的重要性,偷懒一点都有可能出问题。
这个可体现不出来。这件事实质上就是你在制作的时候缺乏一致性,没有把复制的文字同样用到链接里,和用不用国标关系不大。软件行业对文件名编码的兼容性问题上,早有共识只用ASCII编码中的可打印字符部分,否则要在某些非中文环境的系统上,你这个zip文件包解压一样会把文件名搞出问题。
我把导致我发生错误的那个PDF文件也放上来吧。
六祖坛经曹溪原本.pdf
(390.89 KiB) 已下载 57 次
就是复制它的这个“六”字出的错。
在文本编辑器里,两个“六”并排在一起,字体放得很大,才能看出区别。(如下图所示)
66_text.png
astolia 写了: 2021-07-12 21:13 另外顺便提一下,在html文件里指定字符集,简单的用<meta charset="utf-8"/>就行了。你用的在content里指定charset的方法虽然繁杂了点,本来也没错,但是你多加了个引号,导致整个声明实际上是无效的。之所以除了IE以外的浏览器还能正常显示,只是因为它们默认就是用utf8编码
原来如此,谢谢指正。
我指定charset的方法也是在网上搜索到的,只管复制粘贴了,都没仔细检查,不知道多了个引号这个问题。
正如你之前所说过我一次的那样:我都是找到一个方法,感觉能用就行,并不了解更深入、更细微的规范用法。
头像
Ping-Wu
帖子: 1822
注册时间: 2012-11-14 9:34
系统: Debian 12

Re: 同一个汉字 ,却不同编码,所带来的麻烦。

#4

帖子 Ping-Wu » 2021-07-13 0:22

我查了一下 unicode /u+d9d1 的定义,它会被 "decompose“ 成 /u+516d,表示这两个字是一样的。不信的话到 LibreOffice 去,输入(ctrl+shift+u+d9d1)跟(ctrl+shift+u+516d)会出现同样的字。我在猜(完全是带有偏见的瞎猜)Ubuntu 对于中文处理,不是完全照规矩来(可能是没有赚头没有人在积极维持),这是我们决定放弃 Ubuntu 全面转到 Debian 的原因(之一)。但不是主要原因。
Screenshot from 2021-07-12 06-21-08.jpg
Screenshot from 2021-07-12 06-21-24.jpg
LibreOffice Writer:
Screenshot from 2021-07-12 07-51-47.jpg
回复