Home  >  Article  >  Backend Development  >  php编码问题

php编码问题

WBOY
WBOYOriginal
2016-06-23 13:47:44862browse

nbsp;html>






echo strlen("星");
?>  




为什么echo strlen("星")输出的是3  
strlen() 函数返回字符串的长度,以字符计。
1个汉字=2个字节 输出来不是2吗
和编码有关系吗?  


回复讨论(解决方案)

echo mb_strlen("星",'gbk');


1

echo strlen("星")输出的是3
表示你的程序文件保存成了 utf-8 编码的了

在strlen计算时,对待一个UTF8的中文字符是3个长度
这是固定值,不必理会为什么.
因为我也不知道.

在utf-8编码下,一个汉字占3个字节,所以返回3.

这个函数和编码有非常大的关系,需要选用正确的编码才能得出正确的数值

学习了  编码要统一啊

utf-8下,中文是3个字符

<?php$str = '我';echo strlen($str).PHP_EOL;$encode = mb_detect_encoding($str, array("ASCII","UTF-8","GB2312","GBK","BIG5")); echo $encode;

3 UTF-8

UTF8是中文是三?字符的


echo strlen("星");

我的不管是 utf-8 还是 gbk都是输出3
重装后两个都是输出 2
我彻底凌乱了

echo mb_strlen("星",'gbk');

1




为什么
echo mb_strlen("星",'gbk');   输出是1
echo mb_strlen("星",‘utf-8’); 我输出的是1
 

<?php$str = '我';echo strlen($str).PHP_EOL;$encode = mb_detect_encoding($str, array("ASCII","UTF-8","GB2312","GBK","BIG5")); echo $encode;


输出是2 EUC-CN

echo strlen("星");
怎样在utf-8下输出3
在gbk下输出2

将你的文件保存为utf-8编码就是在utf-8下。保存为ANSI格式就是gbk下。


echo strlen("星");

我的不管是 utf-8 还是 gbk都是输出3
重装后两个都是输出 2
我彻底凌乱了



不是这个编码,而是你的php文件保存时的编码。
UTF8 中文是3个字符
GBK 中文是2个字符






请问你这个软件叫什么名字,我也想下载
我之前那些代码都是用Visual Studio 2013 写的,再把后缀名改为php,经常出现一些奇怪的问题

最后一个小疑问
echo mb_strlen("星",'gbk');
utf-8 下  输出  2
ansi 下  输出 1

echo mb_strlen("星",'utf-8');
utf-8 下  输出  1
ansi 下  输出 1

这个是怎么一回事??

不是这个编码,而是你的php文件保存时的编码。
UTF8 中文是3个字符
GBK 中文是2个字符



不可以转码吗?

不可以!

只是通知浏览器用 charset 指定的字符集解释内容
如果你的程序文件是 utf-8 的,那么声明 charset=gbk 只会导致乱码
而没有  反而会因浏览器的自动识别功能,不出现乱码

设置文件的编码和声明charset是不同的,如果需要设置文件编码,一般的软件就可以解决,如notepad++

echo mb_strlen("星",'gbk');
utf-8 下  输出  2
ansi 下  输出 1

echo mb_strlen("星",'utf-8');
utf-8 下  输出  1
ansi 下  输出 1

这个是怎么一回事??






请问你这个软件叫什么名字,我也想下载
我之前那些代码都是用Visual Studio 2013 写的,再把后缀名改为php,经常出现一些奇怪的问题

editplus

?於mb_strlen 可以看看?? http://developer.51cto.com/art/201105/263103.htm

可以这样理解。
echo mb_strlen("星",'gbk');
utf-8 下  输出  2     //  一个中文在utf-8下占三个字节,在gbk下占两个字节, 以gbk算的话,就是3/2 = 1.5个字符,半个字符也算一个,所以输出2
ansi 下  输出 1   

echo mb_strlen("星",'utf-8');
utf-8 下  输出  1 
ansi 下  输出 1     // 这里就是2/3 小于1,也是按1算。

所以用mb_strlen 检测字符串包含的字符数时,编码统一就不会有问题了。

谢谢大家,我懂了

echo mb_strlen("星",'gbk');
utf-8 下  输出  2
ansi 下  输出 1

echo mb_strlen("星",'utf-8');
utf-8 下  输出  1
ansi 下  输出 1

这个是怎么一回事??


不同的环境中出现了不同的结果,这是因为你错误的使用了参数造成的!
mb 系列函数的 encoding 参数用于指明被操作的字符串的字符集,给错了自然结果也就错了
所以在使用时应用 mb_detect_encoding 或 mb_check_encoding 函数取得字符串实际的字符集
$s = '星';$charset = mb_detect_encoding($s, 'utf-8, gbk');echo mb_strlen($s, $charset);
$charset = mb_check_encoding($s, 'utf-8') ? 'utf-8' : 'gbk';echo mb_strlen($s, $charset);

由于 mb_detect_encoding 容易出现误判,所以新增了比较准确的 mb_check_encoding 函数
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn