0

gb2312 是一个双字节字符集,使用 mb_strlen() 检查单个汉字会返回 2,但如果再多 2 个字符,有时结果很奇怪,有人知道为什么吗?我怎样才能得到合适的长度?

<?php
header('Content-type: text/html;charset=utf-8');//
$a="大";
echo mb_strlen($a,'gb2312'); // output 2
echo mb_strlen($a.$a,'gb2312'); // output 3 , it should be 4
echo mb_strlen($a.'a','gb2312'); // output 2, it should be 3
echo mb_strlen('a'.$a,'gb2312'); // output 3, 
?>

谢谢 deceze,你的文档很有帮助,像我这样对编码知之甚少的人应该阅读它。每个程序员绝对肯定需要了解的编码和字符集以处理文本

4

4 回答 4

4

尝试将 MB 内部编码设置为 UTF-8

/* Set internal character encoding to UTF-8 */
mb_internal_encoding("UTF-8");

http://www.php.net/manual/en/function.mb-internal-encoding.php

于 2012-10-22T16:08:06.263 回答
4

您的字符串可能存储为 UTF-8。

的 UTF-8 代码"大"E5 A4 A7(根据这个网页),所以:

$a       // 3 bytes, gb2312 -> 2 char (1 + 0.5)
$a . $a  // 6 bytes, gb2312 -> 3 char
$a . 'a' // 4 bytes, gb2312 -> 2 char
'a' . $a // 4 bytes, first byte is <128 so will be interpreted as one
         // single character, gb2312 -> 3 char

这只是一个猜测,但如果这样想,对我来说完全有意义。您可能可以参考这个维基百科页面

如果你真的想测试,我建议你创建一个以 gb2312 编码保存的单独文件,并使用fopen或其他任何方式读取它。然后,您将确定它处于所需的编码中。

于 2012-10-22T16:19:23.840 回答
0

我认为你必须使用 utf-8 而不是 gb2312

试试这个:

<?php
header('Content-type: text/html;charset=utf-8');//
$a="大";
echo mb_strlen($a,'utf8'); // output 1
echo mb_strlen($a.$a,'utf8'); // output 2 
echo mb_strlen($a.'a','utf8'); // output 2
echo mb_strlen('a'.$a,'utf8'); // output 2, 
?>
于 2012-10-22T16:17:27.133 回答
0

通过写入$a = "大";PHP 文件,该变量$a包含源代码文件中引号之间的字节序列。如果该源代码文件以 UTF-8 保存,则该字符串是表示字符“大”的 UTF-8 字节序列。如果源代码文件保存在GB2312中,则为代表“大”的GB2312字节序列。但是保存在 GB2312 中的 PHP 文件实际上不会被解析为有效的 PHP,因为 PHP 需要与 ASCII 兼容的编码。

mb_strlen应该以指定的编码为您提供给定字符串中的字符数。mb_strlen('大', 'gb2312')期望字符串是 GB2312 字节序列表示,并且应该返回1。即使 GB2312 是双字节编码,您期望它返回 2 也是错误的。mb_strlen返回字符数。

strlen('大')会给你字节数,因为它是一个天真的旧式函数,它对编码一无所知,只计算字节数。

The bottom-line being: your expectation was wrong, and you have a mismatch between what the "大" is actually encoded in (whatever you saved your source code as) and what you tell mb_strlen it is encoded in (gb2312). Therefore mb_strlen cannot do its job correctly and gives you varying random results.

于 2012-10-22T16:45:46.427 回答