php截取字符串,无乱码
今天面试,有一道题,要求截取中文字符无乱码。
当时因为要赶去另一家去面试,没有仔细分析。
虽然现在供职的这家公司b2c项目正在用,因为当时赶项目,是网上拿来直接用的。
回来以后再重新整理了一下。
代码贴出来:
<?php
header("Content-Type:text/html; charset=utf-8");
function utf8_substr($str,$len){
for($i=0;$i<$len;$i++){
$temp_str=substr($str,0,1);
if(ord($temp_str) > 127){
if($i<$len){
$new_str[]=substr($str,0,3);
$str=substr($str,3);
}
}else {
$new_str[]=substr($str,0,1);
$str=substr($str,1);
}
}
return join($new_str);
}
?>
ord()返回字符串第一个字符的ascii值,因为英文,数字及特殊字符的ascii码都不大于127,
ord()>127即可判断是中文。在utf8中,中文占3个字节所以遇到中文字符,用三个字节当一个字节即可。
strlen("你好");输出6,可以验证这一点。
如果是gbk则中英文都占2个字节;但是strlen("ab")英文字符都返回2个长度。
strlen("你好");gbk返回4,utf8返回6; mb_strlen("你好","gbk");返回2;mb_strlen("你好","utf-8");返回2。
所以如果是gbk只需要截取将3变成2即可。
要注意:计算总长的时候一定要用mb_strlen() [截取的时候不用]
也可以用
string mb_strcut ( string $str , int $start [, int $length [, string $encoding ]] )
string mb_substr ( string $str , int $start [, int $length [, string $encoding ]] )
int mb_strlen ( string $str [, string $encoding ] )
继续面试题,将字符翻转包括中英文
如果对php比较熟悉,很容易想到的是strrev(),但是很不幸,strrev翻转中文会乱码。
也有人会想到:
$arr = explode('',$str);
$temp = array_reverse($arr);
implode('',$temp);
很不幸,explode用''做分割,js可以。
对于中文,utf-8编码:
function reverse($str)
{
$ret = "";
$len = mb_strlen($str,"utf-8");
for($i=0; $i< $len; $i++)
{
echo $i;
$arr[] = mb_substr($str, $i, 1, "utf-8");
}
return implode("", array_reverse($arr));
}
print_r(reverse("你好"));
用mb_strlen();对于这个mb_strwidth();会把中文的字符算为2。循环会空转。
中间可以加上:
if(strlen($str)==mb_strlen($str)){
return strrev($str);
}
php截取字符串,无乱码的更多相关文章
- PHP截取中文无乱码函数——cutstr
转载:http://blog.sina.com.cn/s/blog_694c144f010179wj.html 真正好用的PHP截取中文无乱码函数——cutstr (2012-07-09 11:17: ...
- php实现中文字符串无乱码截取
在PHP开发中会经常用到字符串截取,有的时候字符串截取会出现乱码的情况,那么怎么解决这个问题呢,其实也很容易 首先我们要了解关于中英文占多少字节的问题. ASCII码:一个中文汉字占两个字节的空间. ...
- php字符串无乱码截取函数封装
/** * * 中英混合字符串长度判断 * @param unknown_type $str * @param unknown_type $charset */ function strLength( ...
- php截取中文字符串无乱码的方法
利用php内置方法mb_substr截取中文不乱码,使用起来非常简单 <?php $str = '我喜欢laravel or yii2'; echo mb_substr($str, 0, 1, ...
- PHP中英文字符串截取函数无乱码(mb_substr)和获取中英文字符串字数函数(mb_strlen)
mb_substr( $str, $start, $length, $encoding ) $str,需要截断的字符串 $start,截断开始处,起始处为0 $length,要截取的字数 $encod ...
- php截取中文无乱码
在PHP中需要对字符串进行截取,如果没有装mb扩展(mb_substr函数),对中文截取就需要进行相应的处理.下面是对字符串 "世s界s的功s\\\夫萨的mn是非得失sdf dsf dsf ...
- js截取中英文字符串、标点符号无乱码示例解读
<script> function subString(str, len, hasDot) { var newLength = 0; var newStr = ""; ...
- PHP实现中文字符串截取无乱码
在我们学习PHP知识的过程中,PHP截取字符串应该是一个非常常见的字符串基础操作了,想必大家都比较熟悉这方面知识点. 但是有些新手朋友们可能遇到过,当截取中英文字符串时出现乱码的情况,其实这个也是非常 ...
- php中文截取无乱码方法
直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一个中文字符“锯”成两半.解决办法: 1.使用mbstring扩展库的mb_substr截取就不会出现乱码了. ...
随机推荐
- poj 2406 Power Strings【最小循环节】
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 36926 Accepted: 15254 D ...
- iOS9上的Universal Link实现(教程)
1.Universal Link 理解为苹果官方支持deeplink就行了 2.通过点击HTTP链接启动APP Web・iOS应用在支持Universal Link的前提下,当用户点击特点的链接时会自 ...
- Asp.net mvc 自定义全局的错误事件HandleErrorAttribute无效
Asp.net mvc 自定义全局的错误事件HandleErrorAttribute,结果无效, 原因: 1.没有在RegisterGlobalFilters 里面添加或者你要的位置添加. 2.你把这 ...
- 用CRTP在C++中实现静态函数的多态
我上一篇博客[C++的静态分发(CRTP)和动态分发(虚函数多态)的比较](http://www.cnblogs.com/fresky/p/3504241.html)介绍了如何用CRTP(Curiou ...
- (转)关闭WordPress自动加载的Open Sans字体,总是连接googleapi.com,导致打开wordpress很慢
转自http://www.xuanfengge.com/turn-off-automatic-loading-wordpress-open-sans-fonts.html 一.'在网上搜了一番,有四种 ...
- 開始折腾cocos2d-x,使用批处理来创建项目
開始抽出时间学习cocos2d-x了.尽管C和C++还都不咋地.只是在开发中学习记忆也许会更深吧. so决定从今天開始正式学习的用自己的空暇时间折腾它了.正好这个五一没什么事.昨天搭建了一下开发环境. ...
- 动态规划入门——Eddy's research II
转载请注明出处:http://blog.csdn.net/a1dark 分析:找规律 #include<stdio.h> int main(){ int m,n; while(scanf( ...
- Flume NG中的Kafka Channel
kafka(官网地址:http://kafka.apache.org)是一款分布式消息发布和订阅的系统 在Flume中的KafkaChannel支持Flume与Kafka整合,可以将Kafka当做ch ...
- iOS中保证线程安全的几种方式与性能对比
来源:景铭巴巴 链接:http://www.jianshu.com/p/938d68ed832c 一.前言 前段时间看了几个开源项目,发现他们保持线程同步的方式各不相同,有@synchronized. ...
- centos6.7 install chrome
1.yum仓库 (如果用rpm包安装 可以忽略此步) vim /etc/yum.repos.d/google-chrome.repo [google-chrome] name=google-chrom ...