PHP将某些字符计为3个字符

时间:2014-02-09 01:41:17

标签: php string utf-8 special-characters

我试图在特殊字符之间插入文本,但问题是php将某些特殊字符解释为3个字符,原因不明。例如,如果您在以下任何符号上使用strlen(),它将返回3:

➊➜❚✶➪

因此,我需要一种方法来弄清楚如何在字符串的每个特殊字符之间添加内容。例如,如果字符串是:

TE➊➜❚S✶T➪

理想输出将是:

|T|E|➊|➜|❚|S|✶|T|➪|

我尝试过使用它:

<?php
$string = 'TE➊➜❚S✶T➪';
$array = str_split($string);
foreach ($array as $char) {
    $newstring .= '|'.$char;
}
$newstring .= '|';
echo $newstring;
?>

但是,由于php将特殊字符解释为3个字符,因此它会在三个字符的每个字符之间插入标记,这会导致输出显示如下:

|T|E|â|ž|Š|â|ž|œ|â||š|S|â|œ|¶|T|â|ž|ª|

因此它正在改变这样的符号:

➊ => ➊
➜ => âžœ
❚ => âš
✶ => ✶
➪ => ➪

将每个单个字符设置为数组的元素。

问题为了在每个字符之间插入一些字符串,有没有办法将这些符号计为一个字符?

我尝试过:

  1. 以UTF-8编码
  2. 无BOM的UTF-8编码
  3. 使用htmlspecialchars()
  4. 使用htmlspecialchars_decode()
  5. 使用htmlentities()
  6. 使用html_entity_decode()
  7. 所有这些都绝对没有变化。
    有什么办法吗?感谢。

3 个答案:

答案 0 :(得分:2)

函数str_split仅适用于单字节字符串。如果您需要拆分多字节字符串,请将preg_splitu修饰符一起使用。

替换

$array = str_split($string);

$array = preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY);

答案 1 :(得分:1)

使用mbstring函数,告诉您使用的是UTF-8。此外,htmlspecialchars()等具有charset参数:如果您没有使用ISO-8859-1,并且您的PHP版本低于5.4,则必须将其设置为正确的。

答案 2 :(得分:0)

缺少一件事就是将数组加入到您喜欢的相应字符串中。因此,您可以进行此更改以获得所需的字符串。

$array = preg_split('//u', $s);
print_r($array);
$ss = implode('|', $array);