我不时会遇到文件名中有变音符号的奇怪(错误?)编码的文件。也许编码来自Mac系统,但我不确定。我使用Windows。
例如:
Volkszählung
代替Volkszählung
(尝试在第一个ä之后使用Backspace)。
将其粘贴到带有notepad ++的ANSI编码文件中时,会插入Volksza¨hlung
。
我有两个问题:
a)它来自何处以及编码是什么?
b)在PHP中使用glob()
时,在使用wildchard字符*
时不会列出这些文件。如何在PHP中检测它们?
答案 0 :(得分:3)
那是combining character:具体而言,U + 0308结合了DIARESIS。组合字符可以让你把变音符号放在任何字符上,而不仅仅是具有内置变音符号的特定“预合成”字符,例如U + 00E4 LATIN SMALL LETTER A WITH DIAERESIS。虽然在这种情况下使用组合字符不是必要(因为存在合适的预组合字符),但它也不是错误。
(注意,这根本不是“编码”:在Unicode的上下文中,编码是一种将Unicode codepoint数字转换为字节序列的方法,因此它们可以存储在文件中。 -8和UTF-16是编码。但组合字符是Unicode代码点,就像普通字符一样;它们不是编码过程产生的东西。)
如果您正在使用Unicode文本,那么您应该使用PHP的mbstring函数。内置字符串函数不支持Unicode,并且只将字符串视为字节序列而不是字符序列。我不确定mbstring如何处理组合字符;据我所知,文档根本没有提到它们。
你还应该看一下grapheme functions,它们专门用于处理组合字符。 “字形单位”是由基本字符代码点以及随后的任何组合字符生成的单个视觉字符。
最后,PCRE regex functions支持匹配整个字形集群而不是单个代码点的\X
escape sequence。