PHP str_split和UTF8抛光字符

时间:2016-06-30 15:03:11

标签: php utf-8

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

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

我说的是:“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>"

还有什么想法?

感谢您的帮助

1 个答案:

答案 0 :(得分:4)

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);