【问题标题】:count string length received in UTF-16BE encoding using php使用 php 计算以 UTF-16BE 编码接收的字符串长度
【发布时间】:2014-12-26 20:29:59
【问题描述】:

一个 php 脚本在 HTTP GET 参数中接收一个 UTF-16BE 编码的字符串。我只想统计字符串的字符数

为此,我将其转换为 utf-8

$str=iconv('utf-16be', 'utf-8', $str);

当我使用 strlen($str) 时,它返回错误的计数。我可以使用

1) mb_strlen($str, 'UTF-8');

2) strlen(utf8_decode($str));

我想知道哪个是最好的方法? 都会正确计算所有字符吗?

【问题讨论】:

  • 只使用第一个变体,因为 utf8_decode 会乱码

标签: php string encoding utf-8


【解决方案1】:

你必须看看这些函数实际上做了什么。

  • strlen() 计算字符串的二进制长度 - 即字节数(或一个字符为一个字节的字符数)。

此函数适合统计 UTF-16BE 编码的二进制字符串中 Unicode 码位的数量。

相反,您可以使用

它应该返回 unicode 代码点的数量。

那么最好的方法是什么?这取决于您想了解什么。

如果需要获取字符串的二进制长度,取strlen

如果您需要特定编码的字符串的字符数,请使用正确的编码参数mb_strlen

这就是字符串长度的全部内容了。


对于您命名的其他功能:

  • iconv() 在不同编码之间重新编码字符串。这并不总是可行的。
  • utf8_decode() 将字符串从 UTF-8 重新编码为 ISO-8859-1(Latin-1),这根本不适合 UTF-16BE。

这两个与字符串长度无关。尤其是你建议的组合:

$str = iconv('utf-16be', 'utf-8', $str);
$len = strlen(utf8_decode($str));

不稳定。不稳定意味着,它不适用于所有 UTF-16BE 输入。但是,您可以从 UTF-16BE 重新编码为 UTF-8(此处使用 iconv)并获取 UTF-8 字符串长度(但不能通过 utf8_decode):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    相关资源
    最近更新 更多