【问题标题】:php preg_replace: unicode modifier for ascii stringsphp preg_replace: ascii 字符串的 unicode 修饰符
【发布时间】:2012-04-16 05:32:55
【问题描述】:

我需要使用正则表达式处理我的 php 脚本中的字符串。但是有一个问题——不同的字符串有不同的编码。如果字符串只包含 ascii 符号,mb_detect_encoding 函数返回 'ASCII'。但如果字符串包含俄语符号,例如,mb_detect_encoding 返回 'UTF-8'。我想手动检查每个字符串的编码并不是一个好主意。 所以问题是 - 对 ascii 字符串使用 preg_replace (带有 unicode 修饰符)是否正确?为 ascii 和 utf-8 字符串编写这样的代码preg_replace ("/[^_a-z]/u","",$string); 是否正确?

【问题讨论】:

    标签: php regex unicode preg-replace ascii


    【解决方案1】:

    7 位 ASCII 字符集以相同的 UTF-8 编码。如果你有一个 ASCII 字符串,你应该可以在它上面使用 PREG "u" 修饰符。

    但是,如果您有一个“补充的”8 位 ASCII 字符集,例如 ISO-8859-1、Windows-1252 或 HP-Roman8,则最左边的位设置为 on(值 x80 - xff)的字符不会被编码在 UTF-8 中也是如此,不适合使用 PREG "u" 修饰符。

    【讨论】:

      【解决方案2】:

      如果两个选项是“UTF-8”或“ASCII”,这没有问题,但事实并非如此。

      如果 PHP 不使用 UTF-8,它使用 ISO-8859-1,它不是 ASCII(它是 ASCII 的超集,因为前 127 个字符。它是 ASCII 的超集。一些字符,例如瑞典语的åäö,可以用 ISO-8859-1 和 Unicode 表示,用不同的代码点!我认为这对于 preg_* 函数没有多大关系,所以它可能不适用回答您的问题,但在使用不同的编码时请记住这一点。

      你应该真的,真的试着知道你的字符串在哪个字符集中,没有 mb_detect_encoding 的魔力(mb_detect_encoding 不是保证,只是一个很好的猜测)。例如,通过 HTTP 获取的字符串确实具有在 HTTP 标头中指定的字符集。

      【讨论】:

      • >通过 HTTP 获取的字符串确实具有在 HTTP 标头中指定的字符集。我发送<meta http-equiv="content-type" content="text/html; charset=utf-8"> 标头。无论如何,如果我对 $_POST 变量使用 mb_detect_encoding,它会返回“ascii”。这是否意味着猜测错误并且字符串是 utf-8 编码的?
      • 不,如果它说 ASCII,它很可能是 ASCII,这意味着所有字符的代码点都小于 128(几乎所有编码都共享这些代码点以实现向后兼容性)。这意味着 ASCII 检测应该是完全正确的,但其他编码可能不是。但请注意,还有其他编码,如果不是 UTF-8,PHP 中的标准是 ISO-8859-1(定义字符 128-255 的 ASCII 超集)。如果没有指定编码,ISO-8859-1 也是整个网络的标准。
      • 对不起,我还是不明白。发送上述标头<meta http-equiv="content-type" content="text/html; charset=utf-8"> 是否意味着我的服务器接收到所有用户数据 utf-8 编码? 1)如果是,为什么其中一些是ascii编码的?如果那是因为 php 在可能的情况下尝试分配更少的内存,我猜该字符串可以是 ascii 或 utf-8 编码,仅此而已。如果是这样,我没有更多的问题。 2)如果不是,我如何“禁用”除 unicode 之外的所有编码?
      • 如果您在谈论表单帖子,是的,发布的表单应该与您的网页使用相同的字符集(所有主要浏览器都这样做)。 1) UTF-8 和 ASCII 在它们的 127 个第一个代码点中重叠,因此例如字母 a-z 和数字 0-9 在两种编码中具有完全相同的代码点。因此,mb_detect_encoding 无法区分这两个字符集,因为它们提供完全相同的二进制数据。综上所述,如果字符串都来自您自己的 Web 表单,那么您可以指望它们与您的网页具有相同的字符集。
      【解决方案3】:

      是的,当然,您始终可以使用 Unicode 修饰符,它既不会影响结果也不会影响性能。

      【讨论】:

      • Preg_replace 自动将所有ascii参数转换为unicode?​​span>
      • ASCII 字符(代码点 0-127)在 UTF-8 中是相同的,所以不需要转换。
      • 现在我不明白了。我认为比较不是字符的代码点,而是 ascii 字符串的每个字节和 utf-8 的每个 2 个字节。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 2021-11-11
      • 2011-02-01
      相关资源
      最近更新 更多