【问题标题】:PHP strlen and mb_strlen not working as expectedPHP strlen 和 mb_strlen 没有按预期工作
【发布时间】:2011-07-05 22:42:31
【问题描述】:

当我在字符串上运行 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() 提供几种不同的字符编码类型,它们都返回带有这些非标准字符的字符串的奇怪计数。

我不知道为什么会这样。

【问题讨论】:

  • 您的数据来自哪里?尝试将 iconv_set_encoding("internal_encoding", "UTF-8"); 添加到 PHP 脚本的顶部。
  • 您是否尝试仅测量“4½”字符串长度?多长时间?

标签: php character-encoding


【解决方案1】:

仔细检查您的文本是否真的是 UTF-8。那个“”字符让我看起来像是一个经典的字符编码问题。您应该检查从文本来源到您上面引用的代码中的点的整个路径,因为有很多地方可以修改编码。

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

文本是否在此过程中存储在数据库中?确保数据库以 UTF-8 存储和返回数据。这意味着检查服务器的全局默认值、数据库或架构的默认值以及表本身。

【讨论】:

  • 它存储在数据库中。先看那里是个好主意。谢谢。
【解决方案2】:

您的输入很可能是以 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() 不会解决这个问题。

【讨论】:

    猜你喜欢
    • 2014-03-12
    • 2012-01-16
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多