2点二进制的方式来写元音变音 - 对于相同的附加符号(变元音)不同UTF-8签名(Different

2019-07-31 05:32发布

我有一个比较大的问题,在这里我找不到任何帮助周围的网址:

我从OSX到Linux网站移动的页面(两个系统都在de_DE.UTF-8上运行),并在相当未知运行的问题:一些文件已不再发现,但在硬盘与存在明显(明显)相同的名称。 所有这些文件包含德国日尔曼

我花了一个样本图像,复制原始请求URI从网页上,直接把它叫做 - 同样的错误。 重写文件的名称后,它的工作。 是的,我没有打错字了!

这让我很吃惊,我接过来一看到Apache日志,我发现这些条目:

192.168.56.10 - - [27/Aug/2012:20:03:21 +0200] "GET /images/Sch%C3%B6ne-Lau-150x150.jpg HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.1"
192.168.56.10 - - [27/Aug/2012:20:03:57 +0200] "GET /images/Scho%CC%88ne-Lau-150x150.jpg HTTP/1.1" 404 4205 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.1"

这是我的东西,调查......这就是我在UTF8 chartable发现http://www.utf8-chartable.de/ :

ö   c3 b6   LATIN SMALL LETTER O WITH DIAERESIS
¨   cc 88   COMBINING DIAERESIS

我想你已经听说过死键所: http://en.wikipedia.org/wiki/Dead_key如果没有,请阅读文章。 这是相当有趣;)

这是否意味着,该OSX保存所有变音符号分开的信? 难道真的是说,OSX保存字符ö邻¨而是采用了真正的字符,该组合的结果?

如果是的话,你知道,我可以用它来重命名这些文件一个好剧本的? 这会不会是第一页,我从OSX转移到Linux ...

Answer 1:

这并不完全是一回事死键,但它是相关的。 正如你已经计算出,U + 00F6和U + 006F其次是U + 0308具有相同的视觉效果。

其实有在明知对待他们一样,这是基于Unicode的分解规则。 有一个在字符数据库中的表分解,它告诉我们,U + 00F6 规范地分解为U + 006F其次是U + 0308。

除了标准分解,有兼容性分解。 这些丢失某些信息,例如²最终被分解为2 。 这显然是一个破坏性的变化,但是当你想成为一个有点模糊(谷歌是如何知道一个搜索它是进行搜索有用fiſh应该返回结果大约鱼)。

如果有一个非组合字符后超过一个组合字符,那么我们就可以重新排序他们,只要我们不要再为了同种类的 。 当我们认为它无关紧要,我们是否把东西一变音符号,然后重音符,或急性再一个变音符号,这变得清晰,但如果我们把两者的急性和元音上的一个字母清楚什么重要办法解决他们去。

由此看来,我们有4种标准化形式。 把字符串到适当的范式进行比较之前,你没有得到绊倒。

NFD:通过规范地分解它尽可能分开打破一切。 重新排列它们的组合类的顺序组合字符,但要保留所有相对于彼此相同的顺序在同一个班级。

NFC:一是把一切都变成NFD。 然后继续看组合字符,从而,如果没有同一类的较早的企业之一。 如果有一个相当于单个字符,然后替换它们,并重新做扫描希望进一步构成。

NFKD:像NFD,但使用兼容性分解(破坏性的变化,但可用于比较如上述解释)。

NFD:做NFKD,然后再结合规范只按NFC。

也有禁止使用的NFC所以这是有效的NFC以Unicode的一个版本,文本不不再是NFC,如果Unicode有更多的字符添加到它的一些重新组合。

NFD的和NFC,NFC显然是更简洁。 这不是最简洁可行的,但它是一个非常简洁,可以为测试和/或创造了一个非常有效的流传输方式。

Mac OSX上使用NFD文件名。 因为他们是怪人。 (好吧,还有更好的论点比,他们只是没有说服我!)

在Web角色模型使用NFC。*因此,你应该在网页的东西使用NFC尽可能。 目前虽然可以安全方面的考虑盲目转换的东西NFC。 但是,如果从你开始,它应该在NFC启动。

与文本涉及任何编程语言应该有normlising文本的一个很好的方式进入任何这些形式。 如果你不抱怨(或者,如果你是开源的,贡献力量!)。

见http://unicode.org/faq/normalization.html更多,或http://unicode.org/reports/tr15/为全面血淋淋的细节。

*对于额外的乐趣,如果你插入在XML或HTML元素的内容开始一个结合长斜线覆盖(U + 0338)开始的东西,它会打开>标签的成 ,把良好的XML为乱码。 由于这个原因,网络人物模型坚持,每一个实体本身必须是NFC,而不是与组合字符开始。



Answer 2:

谢谢,乔恩·汉纳的大部分背景信息在这里! 这是重要的是得到完整的答案:一种方法,从一个到另一个范式转换。

由于我的变化是在在数据库链接的文件系统(因为文件上传的),我现在有更新我的数据库转储。 该文件在移动过程中已经得到了更名(也许在FTP客户端...)

命令行工具来转换的字符集Linux上:

  • 的iconv - 转换流(可能是文件)的内容
  • convmv - 转换文件名的目录

该字符集UTF-8-MAC(如描述http://loopkid.net/articles/2011/03/19/groking-hfs-character-encoding ),我可以使用的iconv,似乎存在只是OSX系统所以我有我的SQL转储移动到我的MAC,转换它,它移回原位。 另一种选择是使用convmv到NFD的文件重命名回,但是这会比在未来帮助更多的阻碍,我想。

该工具convmv有一个内置的(操作系统无关)选项来执行或NFC的NFD兼容的文件名: http://www.j3e.de/linux/convmv/man/

PHP本身(的语言我的系统- WordPress是基于)支持兼容层在这里: 在PHP中,我如何在编码文件名处理差异上HFS +其他地方对比? 之后,我解决了这个问题对我来说,我会去写一些测试,也可以写信给Wordpress和我一起工作的其他系统中的错误报告;)



Answer 3:

Linux发行版把文件名作为二进制字符串,意味着没有编码假设 - 尽管图形壳(GNOME,KDE等)可能会基于环境变量,语言环境等一些假设

在另一方面OS-X需要或强制实施(我忘了)自己的UTF-8版本使用Unicode正常化展开所有变音符号到组合字符。

在Linux上,当人们都在文件名中使用Unicode,他们倾向于选择UTF-8字符的预组合,当谈到变音符号。



文章来源: Different UTF-8 signature for same diacritics (umlauts) - 2 binary ways to write umlauts