【问题标题】:PHP str_split and UTF8 polish characters [duplicate]PHP str_split 和 UTF8 抛光字符 [重复]
【发布时间】:2016-06-30 15:03:10
【问题描述】:

我在使用 utf-8 波兰字符拆分单词时遇到问题。

我一直在检查 str_split 的 php 文档,但没有设置字符集的参数。

我有一句话:“mała” 而且我必须用字母拆分它以用 span 包装每个字母并在结果中返回 html 字符串。

str_split('mała') 的结果:

array:5 [
  0 => "m"
  1 => "a"
  2 => b"Å"
  3 => b"‚"
  4 => "a"
]

json_last_error_message() 返回 “UTF-8 格式错误,可能编码错误” 错误,所以我认为这是与波兰字母有关的问题,但我找不到设置 str_split 字符集的方法.

这里准备好要进行 JSON 编码的数组:

array:2 [
  "pieces" => array:6 [
    0 => "<span class="dropable">m</span><span class="dropable">a</span><span class="dropable">m</span><span class="dropable">a</span>"
    1 => "<span class="dropable">m</span><span class="dropable">a</span><span class="dropable">s</span><span class="dropable">a</span>"
    2 => "<span class="dropable">m</span><span class="dropable">a</span><span class="dropable">p</span><span class="dropable">a</span>"
    3 => b"<span class="dropable">m</span><span class="dropable">a</span><span class="dropable">Å</span><span class="dropable">‚</span><span class="dropable">a</span>"
    4 => "<span class="dropable">m</span><span class="dropable">a</span><span class="dropable">c</span><span class="dropable">a</span>"
    5 => "<span class="dropable">m</span><span class="dropable">a</span><span class="dropable">t</span><span class="dropable">a</span>"
  ]
  "engine" => "Wstepne"
]

索引号 3 在字符串和这些格式错误的字符之前包含奇怪的“b”。

生成这些字符串的代码是:

$htmlString = '';
foreach(str_split($piece) as $key => $letter){ 
    $htmlString .= '<span class="dropable">'.$letter.'</span>';
}
return $htmlString;

尝试在 $letter 上使用 utf8_encode,它修复了字符串前面的 b 问题,但仍然创建了 2 个跨度:

3 => "<span class="dropable">m</span><span class="dropable">a</span><span class="dropable">Å</span><span class="dropable">‚</span><span class="dropable">a</span>"

还有什么想法吗?

感谢您的帮助

【问题讨论】:

    标签: php utf-8


    【解决方案1】:

    str_split 在字节级别而不是字符级别上工作(尽管它的名字)。所以实际上你是在拆分 mała 沿着它的字节而不是沿着它的字符。这就是为什么你得到一个由五个项目而不是四个项目组成的数组。索引 2 和 3 一起形成了 ł 的 UTF-8 编码。

    您需要使用mbstringiconv 扩展名来手动拆分您的字符串。

    $str = 'mała';
    $len = mb_strlen($str, 'UTF-8');
    $result = [];
    for ($i = 0; $i < $len; $i++) {
        $result[] = mb_substr($str, $i, 1, 'UTF-8');
    }
    var_dump($result);
    

    【讨论】:

    • 我不会说“字节级别”,更像是假设 1 char = 1 字节,因为 PHP 的核心字符串函数不支持 unicode。
    • 这是真的 - 如果您知道术语 charbyte 是等价的并且 unicode 字符是不同的。否则可能会令人困惑。这就是我选择 byte 的原因。
    • 您还可以使用 intl-extension 中的 grapheme_* 函数,该函数随后在组合的 Unicode 字符上也能正常运行……;)
    猜你喜欢
    • 1970-01-01
    • 2012-05-07
    • 2018-05-24
    • 2012-04-16
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    相关资源
    最近更新 更多