【问题标题】:PHP is Counting Some Characters as 3 CharactersPHP 将某些字符计为 3 个字符
【发布时间】:2014-02-09 01:41:16
【问题描述】:

我试图在特殊字符之间插入文本,但问题是 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()

所有这些都完全没有改变。
有没有办法做到这一点?谢谢。

【问题讨论】:

  • 提示:以html... 开头的函数旨在处理HTML。如果您遇到纯文本编码问题,它们几乎无济于事。
  • 整个页面处理 HTML。它接受用户输入并在其上执行一些 php 操作,然后输出新文本。
  • 老实说,我认为将 &lt;CITE&gt; 转换为 &lt;CI|T|E|&gt; 会破坏您的应用程序。
  • 该网站实际上并未在每个字符之间添加|。我需要的真正结果是一个字符数组,以便进行比较。这个例子只是让问题更容易理解。另外,我刚刚尝试了&lt;CITE&gt;,它运行良好,但我不明白为什么会破坏它。
  • 没关系...我看到人们总是用他们并不真正理解的随机函数破坏他们的输入数据(addslashes()strip_tags() 是最受欢迎的)。我只是想阻止你这样做。很抱歉我的解释不够好。

标签: php string utf-8 special-characters


【解决方案1】:

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

替换

$array = str_split($string);

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

【讨论】:

  • 这很有效,但您介意解释一下它为什么有效吗?
  • => /u => utf-8 模式 => 理解多字节。
【解决方案2】:

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

【讨论】:

  • 是的,我使用的是 UTF-8,htmlspecialchars() 不默认为 UTF-8?
  • 嗯,这取决于我现在看到的版本:"如果省略,则此参数的默认值为 ISO-8859-1 在 PHP 5.4.0 之前的版本中,以及 UTF -8 从 PHP 5.4.0 开始。” 我很高兴默认值已更改,但我认识的大多数人仍在使用 5.3。你用的是什么版本?不知道默认更改了顺便说一句,所以谢谢你让我检查;)
  • 哦,现在是 5.2.17。我明白了。
  • 我知道出于某种原因可能不鼓励在这里说...但感谢您的帮助。
【解决方案3】:

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

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

【讨论】:

  • 谢谢,但这就是问题原始代码中的foreach 的用途。问题是一个字符被分成三个。
猜你喜欢
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多