php - 文件系统上的奇怪元音编码

标签 php encoding diacritics

我有时会遇到文件名中包含奇怪(错误?)变音字符编码的文件。也许编码来自 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/

相关文章:

Python - 将字节解包为 ascii 字符但带有重音符号

php - 如何通过 shell_exec 在 php-apache docker 容器中重新加载 apache?

ios - 无法推断通用参数 S

c# - 如何阻止 git 在 checkout 时破坏编码

java - UTF-8 编码不适用于 Eclipse Java 应用程序

python - 输出具有良好口音的 json

javascript - 在 html/PHP 中使用 javascript 更改变音符号颜色

php - Laravel 5 中的 fatal error

php - 获取 Monolog JSON 堆栈跟踪作为数组

php - 在 Codeigniter 3 中通过 Office365 帐户发送电子邮件 - 连接超时