今天面试,有一道题,要求截取中文字符无乱码。

当时因为要赶去另一家去面试,没有仔细分析。

虽然现在供职的这家公司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截取字符串,无乱码的更多相关文章

  1. PHP截取中文无乱码函数——cutstr

    转载:http://blog.sina.com.cn/s/blog_694c144f010179wj.html 真正好用的PHP截取中文无乱码函数——cutstr (2012-07-09 11:17: ...

  2. php实现中文字符串无乱码截取

    在PHP开发中会经常用到字符串截取,有的时候字符串截取会出现乱码的情况,那么怎么解决这个问题呢,其实也很容易 首先我们要了解关于中英文占多少字节的问题. ASCII码:一个中文汉字占两个字节的空间. ...

  3. php字符串无乱码截取函数封装

    /** * * 中英混合字符串长度判断 * @param unknown_type $str * @param unknown_type $charset */ function strLength( ...

  4. php截取中文字符串无乱码的方法

    利用php内置方法mb_substr截取中文不乱码,使用起来非常简单 <?php $str = '我喜欢laravel or yii2'; echo mb_substr($str, 0, 1, ...

  5. PHP中英文字符串截取函数无乱码(mb_substr)和获取中英文字符串字数函数(mb_strlen)

    mb_substr( $str, $start, $length, $encoding ) $str,需要截断的字符串 $start,截断开始处,起始处为0 $length,要截取的字数 $encod ...

  6. php截取中文无乱码

    在PHP中需要对字符串进行截取,如果没有装mb扩展(mb_substr函数),对中文截取就需要进行相应的处理.下面是对字符串 "世s界s的功s\\\夫萨的mn是非得失sdf dsf dsf ...

  7. js截取中英文字符串、标点符号无乱码示例解读

    <script> function subString(str, len, hasDot) { var newLength = 0; var newStr = ""; ...

  8. PHP实现中文字符串截取无乱码

    在我们学习PHP知识的过程中,PHP截取字符串应该是一个非常常见的字符串基础操作了,想必大家都比较熟悉这方面知识点. 但是有些新手朋友们可能遇到过,当截取中英文字符串时出现乱码的情况,其实这个也是非常 ...

  9. php中文截取无乱码方法

    直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一个中文字符“锯”成两半.解决办法: 1.使用mbstring扩展库的mb_substr截取就不会出现乱码了. ...

随机推荐

  1. Maven浅析-3 Ant Vs Maven

    1.什么是Ant? Ant起源是为了取代构建工具Make.它可以跨系统,建立在Java和XML的基础上,而且非常程式化. Ant更像一个脚本工具,我们必须在Ant内显示地声明做任何事情.在<ta ...

  2. oninput,onpropertychange,onchange的用法和区别

    1.前言 由于工作需要,需实现一个类似于微博输入框的功能,在用户动态输入文字的时候,修改提示“您还可以输入XX字”.如下图所示: 因此,稍微研究了一下oninput,onpropertychange, ...

  3. Lab-Data-Systems-for-Biomanufacturing 生物制药企业实验室数据系统(Starlims)

  4. android考试题

    一.选择题 1. Math.round(11.5)等于多少(    ). Math.round(-11.5) 等于多少(   C  ). A.11 ,-11    B.11 ,-12 C.12 ,-1 ...

  5. jquerymobile知识点三:弹出层popup

    弹出层popup很简单,主要就是弹出验证,登陆注册,提交信息之类的,下面是我写好的一个demo... <div data-role="popup" id="popu ...

  6. malloc()与calloc差别

    Both the malloc() and the calloc() functions are used to allocate dynamic memory. Each operates slig ...

  7. 让Tomcat支持中文路径名和中文文件名

    http://hdwangyi.iteye.com/blog/107709 Tomcat是Java开发者使用得较多的一个Web服务器,因为它占用资源小,运行速度快等特点,深受Java Web程序员的喜 ...

  8. Android 解决双卡双待手机解析短信异常

    开发中,难免会遇到各种各样的适配问题,尤其是经过深度修改定制过的系统,有的无论是软硬件上都有很大的区别,这里不得不提到一种奇葩的机型,没错,那就是双卡双待的手机(比如XT800, A60, S8600 ...

  9. 查看源码Vim+Cscope

    http://blog.csdn.net/huiguixian/article/details/7044869

  10. 从Swap函数谈加法溢出问题

    1.      初始题目 面试题:). 这个题目太经典,也太简单,有很多人都会不假思索结出答案: //Code 1 void Swap(int* a, int* b) { *a = *a + *b; ...