PHP strlen和mb_strlen无法按预期工作

4

当我在一个字符串上运行PHP函数strlen()和mb_strlen()时,它们都返回错误的字符数量。

这是我正在使用的一段代码...

 $foo = mb_strlen($itemDetails['ITEMDESC'], 'UTF-8');
 echo $foo;

它告诉我这个字符串 - “4½” Straight Iris Scissors”是45个字符长,但实际上只有27个。

同时,这个字符串 - “Infant Heel Warmer, No Adhesive Attachment Pad, 100/cs”是54个字符长,计算正确。

我猜测这可能与字符编码有关,应该都是UTF-8格式。我尝试使用mb_strlen()函数检测不同的字符编码类型时,发现含有这些非标准字符的字符串始终返回了奇怪的字符数。

我不知道为什么会出现这种情况。


你的数据从哪里来?尝试在你的PHP脚本顶部添加 iconv_set_encoding("internal_encoding", "UTF-8"); - Kerrek SB
你尝试过仅测量“4½”字符串的长度吗?它有多长? - bitfox
2个回答

2

请仔细检查您的文本是否真正为UTF-8编码。那个“”字符让我觉得这是一个经典的字符编码问题。您应该检查从文本起源到您上面引用的代码点的整个路径,因为有很多地方可能会出现编码错误。

这段文本是否来自HTML表单?请确保您的<form>元素包括accept-charset="UTF-8"属性。

这段文本是否在途中存储在数据库中?请确保数据库以及返回UTF-8格式的数据。这意味着需要检查服务器的全局默认值、数据库或模式的默认值以及表本身。


它存储在数据库中。首先查找那里是个好主意。谢谢。 - Bead

0

你的输入很可能是以UTF-16编码的。 你可以转换为UTF-8

$foo = mb_strlen(mb_convert_encoding($itemDetails['ITEMDESC'], "UTF-8", "UTF-16"));

或者如果你使用mb_strlen(),请确保第二个参数是正确的编码。

$foo = mb_strlen($itemDetails['ITEMDESC'], "UTF-16");

如果没有正确的编码,mb_strlen将始终返回错误的结果。当你处理UTF-8/16/32编码的字符串时,很容易遇到麻烦。mb_detect_encoding()无法解决这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接