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截取就不会出现乱码了. ...
随机推荐
- Maven浅析-3 Ant Vs Maven
1.什么是Ant? Ant起源是为了取代构建工具Make.它可以跨系统,建立在Java和XML的基础上,而且非常程式化. Ant更像一个脚本工具,我们必须在Ant内显示地声明做任何事情.在<ta ...
- oninput,onpropertychange,onchange的用法和区别
1.前言 由于工作需要,需实现一个类似于微博输入框的功能,在用户动态输入文字的时候,修改提示“您还可以输入XX字”.如下图所示: 因此,稍微研究了一下oninput,onpropertychange, ...
- Lab-Data-Systems-for-Biomanufacturing 生物制药企业实验室数据系统(Starlims)
- android考试题
一.选择题 1. Math.round(11.5)等于多少( ). Math.round(-11.5) 等于多少( C ). A.11 ,-11 B.11 ,-12 C.12 ,-1 ...
- jquerymobile知识点三:弹出层popup
弹出层popup很简单,主要就是弹出验证,登陆注册,提交信息之类的,下面是我写好的一个demo... <div data-role="popup" id="popu ...
- malloc()与calloc差别
Both the malloc() and the calloc() functions are used to allocate dynamic memory. Each operates slig ...
- 让Tomcat支持中文路径名和中文文件名
http://hdwangyi.iteye.com/blog/107709 Tomcat是Java开发者使用得较多的一个Web服务器,因为它占用资源小,运行速度快等特点,深受Java Web程序员的喜 ...
- Android 解决双卡双待手机解析短信异常
开发中,难免会遇到各种各样的适配问题,尤其是经过深度修改定制过的系统,有的无论是软硬件上都有很大的区别,这里不得不提到一种奇葩的机型,没错,那就是双卡双待的手机(比如XT800, A60, S8600 ...
- 查看源码Vim+Cscope
http://blog.csdn.net/huiguixian/article/details/7044869
- 从Swap函数谈加法溢出问题
1. 初始题目 面试题:). 这个题目太经典,也太简单,有很多人都会不假思索结出答案: //Code 1 void Swap(int* a, int* b) { *a = *a + *b; ...