我在用 utf-8 波兰字符拆分单词时遇到问题。
我一直在检查 php 文档中的 str_split,但没有设置字符集的参数。
我有字:“ma?a” 我必须用字母分割它以用跨度包装每个单个字母并在结果中返回 html 字符串。
str_split('ma?a') 的结果:
array:5 [
0 => "m"
1 => "a"
2 => b"Å"
3 => b"‚"
4 => "a"
]
Run Code Online (Sandbox Code Playgroud)
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"
]
Run Code Online (Sandbox Code Playgroud)
索引号 3 在字符串和这些格式错误的字符之前包含奇怪的“b”。
生成这些字符串的代码是:
$htmlString = '';
foreach(str_split($piece) as $key => $letter){
$htmlString .= '<span class="dropable">'.$letter.'</span>';
}
return $htmlString;
Run Code Online (Sandbox Code Playgroud)
尝试在 $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>"
Run Code Online (Sandbox Code Playgroud)
还有更多想法吗?
感谢帮助
str_split在字节级别而不是字符级别工作(尽管它的名字)。所以实际上你是ma?a沿着它的字节而不是沿着它的字符分裂。这就是为什么你会得到五个而不是四个的数组。索引 2 和 3 一起构成了 的 UTF-8 编码?。
您需要使用mbstring或iconv扩展名手动拆分字符串。
$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);
Run Code Online (Sandbox Code Playgroud)