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));
我想知道哪一个是最好的方法? 会正确统计所有角色吗?
答案 0 :(得分:0)
你必须看看这些功能实际上是做什么的。
strlen()
计算字符串的二进制长度 - 即字节数(或一个字符为一个字节的字符)。此函数不适合计算UTF-16BE编码二进制字符串中的Unicode代码点数。
相反,您可以使用
mb_strlen($string, "UTF-16BE")
方法(第二个参数设置为“UTF-16BE
”)它应该返回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
):