欧洲'é'字符,ASCII码为101 204 129

时间:2014-11-19 15:00:33

标签: php regex character-encoding ord

我的角色'é'有问题。

ftp_nlist($this->ftpStream, $directory); 我有一个像'Parté.mp4'这样的字符串,但'é'与正则表达式[\p{L}]*\.mp4不匹配

这里有例子:

不起作用的'é'的ASCII码是'101 204 129'。 函数ord($e);其中$ e是奇怪的字符返回'101',它是简单字母e的代码。

似乎我的'é'由三个角色组成,因为我要制作一个 $e = substr($fileName,4,3);获取我的单个角色。

我希望能够在我的正则表达式中授权这些字符... 如果您有任何线索,谢谢。

2 个答案:

答案 0 :(得分:2)

使用扩展的unicode选项。

\X*.mp4

Regex Demo

这里是描述扩展unicode选项的PHP manual

  

\ X转义符合Unicode扩展字形集群。延长   字形集群是一个或多个组合的Unicode字符   形成一个字形。实际上,这可以被认为是Unicode   相当于。因为它将匹配一个组成的角色,无论如何   实际使用了多少个字符来渲染它。

答案 1 :(得分:0)

当您说“无效的'é'的ASCII代码是'101 204 129'”时,您可能意味着字节是十进制的那些数字。 (它们不是ASCII码:它们不能根据ASCII进行解释,此外,ASCII以十进制127结尾。)在十六进制中,这意味着65 CC 81.这是正确的 UTF-8表示基本拉丁字母“e”U + 0065,然后是U + 0301 COMBINING ACUTE ACCENT。这又是“é”的正确分解表示。

因此,您首先需要修复字符编码问题。您不应该处理字符的UTF-8字节,而应处理字符本身。您可能需要修改用于读取数据的例程,或者可能需要修复数据本身(例如,如果已经存在)。

如果您已正确读取UTF-8数据,则组合锐符仍然是匹配的问题,因为它不是字母。您可能需要将数据转换为规范化表格C,将两个字符组合转换为“é”,即字母。