【问题标题】:How do I use non-ascii characters in a PHP array?如何在 PHP 数组中使用非 ascii 字符?
【发布时间】:2015-09-15 13:53:55
【问题描述】:

此代码填充一个数组,该数组用作字母列表的排序指令。 $stringX 包含字母和附加字符,它们应该在字母列表中的同一标题下分组。

在此示例中,指令是以Ǩ 开头的列表项应该被视为以常规 K 开头。为了使用其余代码,将字符串解析为数组结构:

$stringX = "A B C D E F G H I J KǨ L M N O P Q R S T U V W X Y Z";
$result = explode(' ', $stringX);
$settingsArray = array();

foreach ($result as $value) {
   echo "Current set: " . $value . "<br>";
   $firstInGroup = $value[0];
   $allGroupMembers = $value;
   $memberArray = str_split($allGroupMembers);
   echo "Group header: " . $firstInGroup . "<br>";
   echo "All in group: " . $allGroupMembers . "<br>";
   echo "Member array: ";
   var_dump($memberArray);
   echo "<br>";
   $settingsArray[$firstInGroup] = $memberArray;
}

$sorterSettings = $settingsArray;

我的问题是这显然只适用于 ascii 字符。在这个例子中,结果是:

Current value: KǨ
Group header: K
All in group: KǨ
Member array: array(3) { [0]=> string(1) "K" [1]=> string(1) "�" [2]=> string(1) "�" }

由于$allGroupMembers这两个字符串写入三个数组字段,我怀疑是字符有问题。

我知道 UTF-8 会导致 PHP 出现问题,但我不确定最佳解决方案。关于如何将KǨ的每个字符分别写在一个数组字段中,保留特殊字符的建议将不胜感激。谢谢!

【问题讨论】:

  • PHP 5 和 UTF-8 不能很好地结合在一起,但有可能。你想要像 Unicode Normalization C 这样的东西。这将正确地对你的字符和重音进行分组,并使用最少的空间。从此,您通常可以转换为 UTF-8 并使用它。如果您使用的是 PHP 5.3 或更高版本,则可以从 Normalizer 类开始。
  • 看看这个页面上的评论,有 20 票的评论,它应该可以帮助你。

标签: php arrays utf-8 character-encoding


【解决方案1】:

大多数 PHP 函数都使用字节,而不是字符(除了 mb_* 函数和带有 u 修饰符的 preg_ )。对于 ascii 字符串,它是好的。 1 个字节 = 1 个符号。对于 utf-8 字符串,这将不起作用。

所以str_split 使用字节。最好用更合适的东西代替它。例如,您可以采用这个mb_str_split 实现。或者,只需使用

$memberArray = preg_split("//u", $allGroupMembers, -1, PREG_SPLIT_NO_EMPTY);

附: Explode 也是“危险的”。对于此字符串,它按预期工作,因为其他字符中未使用空白字节。但它可能会因其他分隔符而失败。

【讨论】:

    【解决方案2】:

    您的问题是 str_split 仅处理单个字节,而您的特殊 k 用 2 个字节编码(utf8 是可变长度编码,a-Z 用单个字节编码,非常适合 str_split,但您的特殊 k 是 2字节),使用理解 utf8 的函数来拆分这个.. 像 mb_split

    mb_regex_encoding('UTF-8');
    $memberArray =mb_split('/./',$allGroupMembers);
    

    【讨论】:

    • 你不能用mb_split不带分隔符来分割字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 2014-08-28
    • 2018-07-27
    • 1970-01-01
    • 2011-07-26
    • 2014-04-09
    相关资源
    最近更新 更多