【问题标题】:Generating all Unicode characters not in ASCII scheme in PHP?在 PHP 中生成不是 ASCII 方案的所有 Unicode 字符?
【发布时间】:2012-09-13 02:48:40
【问题描述】:

这个正则表达式应该匹配所有非ASCII字符,0-128个码位:

 /[^x00-x7F]/i

假设我想(只是出于好奇)用所有 Unicode 字符(0-1114111 个代码点)测试这个正则表达式。

使用range(0, 1114111) 生成这个范围可能很简单。然后我应该使用dechex() 函数将每个十进制数转换为十六进制。

之后,如何将十六进制数字转换为实际字符?以及如何排除 ASCII 方案中已有的字符?

【问题讨论】:

  • 你想达到什么目的? unicode !== utf-8
  • @JvdBerg 我说的是 utf8 吗?例如,我正在尝试生成一个随机的可打印字符串...
  • @Gremo Unicode 是一种标准,而 UTF-8、UTF-16 和其他字符集是 unicode 的实现。我想大多数人会认为您使用的是 UTF-8,但事实可能并非如此。

标签: php unicode hex ascii


【解决方案1】:

这取决于您将如何进行匹配,以及您是否要将 PCRE 正则表达式引擎放入带有/u 修饰符的UTF-8 mode

如果您确实使用/u修饰符,那么首先您必须对正则表达式和主题都使用UTF-8编码,并且正则表达式引擎将自动将合法的 UTF-8 字节序列解释为一个字符。在这种模式下,正则表达式 [^x00-x7F] 将匹配 Latin-1 supplement 块之外的所有字符,包括代码点大于 255 的字符。您还需要生成每个字符的 UTF-8 表示(给定其代码点)@ 987654323@.

如果你使用/u修饰符,那么正则表达式引擎将是愚蠢的:它将每个字节视为一个单独的字符,这意味着你有在字节而不是字符级别工作。另一方面,您现在可以使用您喜欢的任何编码。但是,您将不得不放弃 [^x00-x7F] 正则表达式(因为它只会匹配字符串中的随机字节)并使用体现您选择的编码规则的正则表达式 (example for UTF-8)。要生成随机字符的编码形式,您将再次需要使用取决于特定编码的自定义代码。

【讨论】:

    【解决方案2】:

    我认为hex2bin(string) 函数会将十六进制字符串转换为二进制字符串。要排除 ASCII 字符代码点,只需从 x80 十六进制代码点开始(跳过 x00 到 x7F)。

    但这听起来确实有点像您正在尝试对正则表达式库进行单元测试,这似乎没有必要,除非您正在开发正则表达式库,或者您需要非常偏执。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-17
      • 2012-04-16
      • 2015-04-22
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 2011-02-06
      相关资源
      最近更新 更多