我有时会遇到文件名中包含奇怪(错误?)变音字符编码的文件。也许编码来自 Mac 系统,但我不确定。我使用 Windows。
例如:
Volkszählung
而不是 Volkszählung
(尝试在第一个 ä 后使用 Backspace)。
当使用 Notepad++ 将其粘贴到 ANSI 编码文件时,它会插入 Volksza¨hlung
。
我有两个问题:
a) 它从哪里来,是哪种编码?
b) 在 PHP 中使用 glob()
在使用通配符 *
时不会列出这些文件。如何在 PHP 中检测到它们?
最佳答案
那是一个 combining character :具体来说,U+0308 合并分娩。组合字符让您可以在任何字符上放置变音符号之类的东西,而不仅仅是带有内置变音符号的特定“预组合”字符,例如 U+00E4 带分音符的拉丁文小写字母 A。尽管在这种情况下没有必要使用组合字符(因为存在合适的预组合字符),但它也不是错误的。
(请注意,这根本不是“编码”:在 Unicode 的上下文中,编码是一种将 Unicode codepoint 数字转换为字节序列以便将它们存储在文件中的方法。UTF-8和 UTF-16 是编码。但是组合字符是 Unicode 代码点,就像普通字符一样;它们不是编码过程产生的东西。)
如果您使用的是 Unicode 文本,则应该使用 PHP 的 mbstring职能。内置字符串函数不识别 Unicode,并且仅将字符串视为字节序列而不是字符序列。不过,我不确定 mbstring 如何处理组合字符;据我所知,文档根本没有提及它们。
您还应该看看 grapheme functions ,专门用于处理组合字符。 “字素单元”是由基本字符代码点加上其后的任何组合字符产生的单个视觉字符。
最后,PCRE regex functions支持\X
escape sequence匹配整个字素集群而不是单个代码点。
关于php - 文件系统上的奇怪元音编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33329354/