MB_CASE _ * _ SIMPLE常量的用途是什么?

Ben*_*min 5 php mbstring

根据手册,在PHP 7.3中添加了以下常量:

  • MB_CASE_FOLD
  • MB_CASE_LOWER_SIMPLE
  • MB_CASE_UPPER_SIMPLE
  • MB_CASE_TITLE_SIMPLE
  • MB_CASE_FOLD_SIMPLE

我找到了一个做什么的例子MB_CASE_FOLD

echo mb_convert_case('?', MB_CASE_FOLD, 'UTF-8'); // ss
Run Code Online (Sandbox Code Playgroud)

但是,我找不到任何有关MB_CASE_*_SIMPLE常量的引用。

乍一看,使用简单的latin1字符,MB_CASE_LOWER_SIMPLE其行为就像MB_CASE_LOWER

什么的MB_CASE_*_SIMPLE从他们做不同MB_CASE_*的同行?

Chr*_*Lam 7

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

并查看 git commit 消息

  • 实现了完整的大小写折叠,但不区分大小写的 mb_* 操作继续使用简单的大小写折叠。原因是 haystack 字符串的全大小写折叠可能会改变匹配发生的位置。这必须映射回原始字符串中的位置。

  • 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

而且,回答VS简单的例子折叠的完整案例折叠的差异。


Ano*_*ous 7

以下是一些重要的示例:

\n\n

MB_CASE_UPPER_SIMPLE:

\n\n
mb_convert_encoding("\xc3\x9f", MB_CASE_UPPER_SIMPLE); // "\xc3\x9f"\nmb_convert_encoding("\xc3\x9f", MB_CASE_UPPER); // "SS"\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

MB_CASE_LOWER_SIMPLE:

\n\n
mb_convert_encoding("\xc4\xb0", MB_CASE_LOWER_SIMPLE); // "i"\nmb_convert_encoding("\xc4\xb0", MB_CASE_LOWER); // "i\\xcc\\x87"\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

MB_CASE_TITLE_SIMPLE与 相似 以MB_CASE_UPPER_SIMPLE同样的方式MB_CASE_UPPER与 相似MB_CASE_TITLE

\n