php编码问题

php中文网
发布: 2016-06-23 13:47:44
原创
1010人浏览过

nbsp;html>






echo strlen("星");
?>  




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

通义灵码
通义灵码

阿里云出品的一款基于通义大模型的智能编码辅助工具,提供代码智能生成、研发智能问答能力

通义灵码 31
查看详情 通义灵码

回复讨论(解决方案)

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 函数
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号