【问题标题】:How get each character from a word with special encoding如何从具有特殊编码的单词中获取每个字符
【发布时间】:2012-11-21 20:42:26
【问题描述】:

当我执行以下代码时,我需要从一个单词中获取一个包含所有字符的数组,但是该单词具有特殊编码的字母,例如 á:

$word = 'withá';

$word_arr = array();
for ($i=0;$i<strlen($word);$i++) {
    $word_arr[] = $word[$i];
}

$word_arr = str_split($word);

我明白了:

array(6) { [0]=> 字符串(1) "w" [1]=> 字符串(1) "i" [2]=> 字符串(1) "t" [3]=> string(1) "h" [4]=> string(1) "Ã" [5]=> string(1) "¡" }

如何获取每个字符如下?

array(5) { [0]=> 字符串(1) "w" [1]=> 字符串(1) "i" [2]=> 字符串(1) "t" [3]=> 字符串(1) "h" [4]=> 字符串(1) "á" }

【问题讨论】:

    标签: php encoding character-encoding tokenize


    【解决方案1】:

    因为是 UTF-8 字符串,就这样吧

    $word = 'withá';
    $word = utf8_decode($word);
    $word_arr = array();
    for ($i=0;$i<strlen($word);$i++) {
        $word_arr[] = $word[$i];
    }
    

    这样做的原因是,即使它在您的脚本中看起来正确,解释器也会将其转换为多字节字符(为什么mb_split() 也可以工作)。要将其转换为正确的 UTF-8 格式,您可以使用 mb 函数或仅指定 utf8_decode()

    【讨论】:

      【解决方案2】:

      我认为 mb_split 会为你做这件事:http://www.php.net/manual/en/function.mb-split.php

      如果您使用特殊编码,您可能想了解 PHP 如何处理一般的多字节编码...

      编辑:不,不知道如何让 mb_split 自己做,但是环顾四周,有一些其他问题得到了 preg_split 的回答。我对此进行了测试,它似乎完全符合您的要求:

      preg_split('//',$word,-1,PREG_SPLIT_NO_EMPTY);
      

      我仍然强烈建议您阅读 PHP 中的多字节字符。这有点乱,恕我直言。

      这里有一些很好的链接: http://www.joelonsoftware.com/articles/Unicode.htmlhttp://akrabat.com/php/utf8-php-and-mysql/ 还有更多可以找到...

      【讨论】:

      • 在这种情况下,您推荐使用哪个 $pattern(mb_split 函数的第一个参数)?
      • mb_split 并不是我们所需要的。它仅基于正则表达式进行拆分。它不会直接将字符串拆分为字符数组。然而,该功能页面上的 cmets 大约在一半时,是一个可以执行所需操作的功能。
      • @G-Nugget - 很好的观点,即使它有点违反直觉。我也无法让它工作,并修改了我的答案。
      【解决方案3】:

      发现于:http://www.php.net/manual/en/function.str-split.php#107658

          function str_split_unicode($str, $l = 0) {
              if ($l > 0) {
                  $ret = array();
                  $len = mb_strlen($str, "UTF-8");
                  for ($i = 0; $i < $len; $i += $l) {
                      $ret[] = mb_substr($str, $i, $l, "UTF-8");
                  }
                  return $ret;
              }
              return preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
          }
      
         $word = 'withá';
         $word = str_split_unicode($word);
         var_dump($word);
      

      【讨论】:

      • 不起作用,返回:array(5) { [0]=> string(1) "w" [1]=> string(1) "i" [2]=>字符串(1) "t" [3]=> 字符串(1) "h" [4]=> 字符串(2) "á" }
      • 这很奇怪,在我的服务器上我得到:array(5) { [0]=> string(1) "w" [1]=> string(1) "i" [2] => 字符串(1) "t" [3]=> 字符串(1) "h" [4]=> 字符串(2) "á" }
      • @leticia2602 - 我猜你的文件不是用 utf-8 编码保存的 - 如果蒂姆威瑟斯的回答对你有用而这个没有用,你的文件可能是用其他编码编码的.尝试使用可让您指定编码的编辑器(如 Notepad2)。
      • @Slave 我有 PHP 版本 5.3.10-1ubuntu3.4
      • @Aerik 我正在使用排序规则从 MySql 表中获取值:utf8_general_ci
      【解决方案4】:

      您应该对所有多字节字符集使用多字节函数!我猜 mb_split 是挂件:

      http://php.net/manual/en/function.mb-split.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-24
        • 2021-04-28
        • 1970-01-01
        • 1970-01-01
        • 2018-11-29
        • 1970-01-01
        相关资源
        最近更新 更多