【问题标题】:What is the purpose of the MB_CASE_*_SIMPLE constants?MB_CASE_*_SIMPLE 常量的用途是什么?
【发布时间】:2020-03-10 12:42:25
【问题描述】:

根据manual,PHP 7.3 中添加了以下常量:

  • MB_CASE_FOLD
  • MB_CASE_LOWER_SIMPLE
  • MB_CASE_UPPER_SIMPLE
  • MB_CASE_TITLE_SIMPLE
  • MB_CASE_FOLD_SIMPLE

我找到了 exampleMB_CASE_FOLD 所做的事情:

echo mb_convert_case('ẞ', MB_CASE_FOLD, 'UTF-8'); // ss

但是,我找不到任何关于 MB_CASE_*_SIMPLE 常量作用的参考。

乍一看,对于简单的 latin1 字符,MB_CASE_LOWER_SIMPLE 的行为就像 MB_CASE_LOWER

MB_CASE_*_SIMPLEMB_CASE_* 对应的有什么不同?

【问题讨论】:

标签: php mbstring


【解决方案1】:

我们可以在https://github.com/php/php-src/blob/master/ext/mbstring/php_unicode.c#L223找到对应的C实现

看看 git commit message:

  • 实现了完全大小写折叠,但不区分大小写的 mb_* 操作继续使用简单大小写折叠。原因是 干草堆字符串的全箱折叠可能会改变位置 发生了一场比赛。这必须映射回 在原始字符串中的位置。

  • mb_convert_case() 公开了完整和简单的大小写映射/折叠,其中 full 是默认值。常量是:

    • MB_CASE_LOWER(由 mb_strtolower 使用)
    • MB_CASE_UPPER(由 mb_strtolower 使用)
    • MB_CASE_TITLE
    • MB_CASE_FOLD
    • MB_CASE_LOWER_SIMPLE
    • MB_CASE_UPPER_SIMPLE
    • MB_CASE_TITLE_SIMPLE
    • MB_CASE_FOLD_SIMPLE(由不区分大小写的操作使用)

因此,带有_SIMPLE 后缀的常量用于 Unicode 的Simple Case Folding,而没有后缀的常量用于Full Case Folding

还有that answers 全壳折叠与简单壳折叠的区别。

【讨论】:

    【解决方案2】:

    以下是一些重要的示例:

    MB_CASE_UPPER_SIMPLE

    mb_convert_encoding("ß", MB_CASE_UPPER_SIMPLE); // "ß"
    mb_convert_encoding("ß", MB_CASE_UPPER); // "SS"
    

    MB_CASE_LOWER_SIMPLE

    mb_convert_encoding("İ", MB_CASE_LOWER_SIMPLE); // "i"
    mb_convert_encoding("İ", MB_CASE_LOWER); // "i\xcc\x87"
    

    MB_CASE_TITLE_SIMPLE 类似于MB_CASE_UPPER_SIMPLE,就像MB_CASE_UPPER 类似于MB_CASE_TITLE

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      相关资源
      最近更新 更多