php-文件系统上的奇怪的变音编码
作者:互联网
有时,我会遇到文件名中的变音符号奇怪(错误?)编码的文件.也许编码来自Mac系统,但我不确定.我使用Windows.
例如:
用Volkszählung代替Volkszählung(尝试在第一个ä之后使用Backspace).
使用记事本将其粘贴到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.
标签:encoding,diacritics,php 来源: https://codeday.me/bug/20191119/2036904.html