php的ord函数——解决中文字符截断问题

php的ord函数——解决中文字符截断问题

分类: PHP2014-11-26 12:11 1033人阅读 评论(0) 收藏 举报

utf8字符截取

函数是这样定义的:

int ord ( string$string)

返回字符串 string 第一个字符的 ASCII 码值。

该函数是chr()的互补函数。

试一下:

echo ord(‘我‘);
这里只能返回230, 我是以u8保存的文件并输出的, 它得到的只有230, 而230转换成hex是e6,实际上utf-8中我的编码是e68891, 它只拿到了第一个字节
echo chr(0xe6).chr(0x88).chr(0x91);

这个例子可以在utf-8的情况下输出”我“这个汉字

如果大家想了解字符编码的问题可以点这里字符编码

如果大家想查看一个汉字的gbk,utf-8,unicode各种编码方式推荐大家用Notepad++下的HEX-editor点击这里下载:

http://pan.baidu.com/s/1hquyJwo

长这样子


提高逼格:

身为一个程序猿,除了是苦逼的代名词外,还是神秘的象征,偶尔装XX还是不错的。既然说到编码,

那我们就说说属于你的字吧,在utf-8编码的世界里,可不是每个人都能找到属于自己的那款哦,

‘我’的编码是三字节,分别为e6、88、91,如果把你的生日放进去能编出啥字呢,想想是不是还有点小激动,

例如你是1988-9-4出生,那对应的属于自己的三字节为e9、88、94,anyway这个规则你也可以自己定义,

爆个料,按照此方法,我的字是‘釉’,好字啊,you you 切克闹。

按照此法为啥不是每个人都有呢,那自己读下utf-8的二进制存储规则就知道了,

哈哈,还是点这里字符编码

扯了一堆没用的,其实就是希望大家发现编码的乐趣

 

自己动手:

很久以前是没有mb_substr函数的,因此带汉字的字符串截断操作处理起来很麻烦,不过现在可以直接用它。

既然我们对字符编码和ord函数有了很好的了解,自己就写个针对utf-8编码的字符串截断的函数吧。

代码很戳,有待优化,但理解起来简单,贴过去可以运行,基本场景也考虑到了,还算欣慰;

[php] view plaincopy

  1. <?php
  2. $a = "jf我们de没";
  3. /**
  4. * @brief
  5. *
  6. * @param $str 待截取的字符串
  7. * @param $start 字符串开始位置
  8. * @param $num  截取到多长的字符串
  9. *
  10. * @return
  11. */
  12. function utf8_substr($str, $start, $num){
  13. $res = ‘‘;      //存储截取到的字符串
  14. $cnt = 0;       //计数器,用来判断字符串是否走到$start位置
  15. $t = 0;         //计数器,用来判断字符串已经截取了$num的数量
  16. for($i = 0; $i < strlen($str); $i++){
  17. if(ord($str[$i]) > 127){    //非ascii码时
  18. if($cnt >= $start){     //如果计数器走到了$start的位置
  19. $res .=$str[$i].$str[++$i].$str[++$i]; //utf-8是三字节编码,$i指针连走三下,把字符存起来
  20. $t ++;              //计数器++,表示我存了几个字符串了到$num的数量就退出了
  21. }else{
  22. $i++;               //如果没走到$start的位置,那就只走$i指针,字符不用处理
  23. $i++;
  24. }
  25. $cnt ++;
  26. }else{
  27. if($cnt >= $start){     //acsii码正常处理就好
  28. $res .=$str[$i];
  29. $t++;
  30. }
  31. $cnt ++;
  32. }
  33. if($num == $t) break;       //ok,我要截取的数量已经够了,我不贪婪,我退出了
  34. }
  35. return $res;
  36. }
  37. var_dump(utf8_substr($a, 3, 10));   //结果应该是你想要的
  38. ?>

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-30 06:37:56

php的ord函数——解决中文字符截断问题的相关文章

python 之 解决中文字符异常

Python在执行过程中,常常出现不能读取中文路径名,表现为读取的路径是空或者直接报错(WindowsError: [Error 2]):也有时候出现不能正常输出中文字符串,编译器报错为(KeyError),这是编码出现了问题.这个时候在字符串后面添加转码操作即可. 详见源码示例如下 [中文字符串] print '品牌id'.decode('utf-8') print '\xe5\x93\x81\xe7\x89\x8cid'.decode('utf-8') 上面两行输出结果是一致的. [中文路径

中文字符截断的问题

function(str,num){ var len=str.length if(str.replace(/[\u4e00-\u9fbf]/g,'**').length <= num){ return str; } while(str.replace(/[\u4e00-\u9fbf]/g,'**').length > num){ str = str.slice(0,len--) } return str+'...' }

php输出中文字符

中文字符不可以使用imagettftext()函数在图片中直接输出,如果要输出中文字符,需要先使用iconv()函数对中文字符进行编码,语法格式如下:string iconv ( string $in_charset, string $out_charset, string $str )说明:参数$in_charset是中文字符原来的字符集,$out_charset是编码后的字符集,$str是需要转换的中文字符串.函数最后返回编码后的字符串.这时使用imagettftext()函数就可以在图片中

PostgreSQL Excel包含中文字符的数据导入方法

1.excel文件处理 删除掉标题行,另存为 以逗号分隔符的CSV文件 2.文件格式处理Notepad ++ 1).文件转换为UNIX格式 2).格式转换为UTF8无BOM 3.上传到数据库导入 注意事项: 1).字符集配置,操作系统字符集LANG=en_US.UTF-8 数据库字符集UTF-8 uccc_im=# \l List of databases Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access p

Servlet &amp; JSP - 中文字符问题

Servlet 中的中文字符 来自 URL 参数部分的中文字符 Tomcat 默认接收数据的编码是 ISO-8859-1.所以当请求 URL 的参数部分含有中文字符,需要转换字符的编码. Enumeration<String> paramNames = req.getParameterNames(); while (paramNames.hasMoreElements()) { String paramName = (String) paramNames.nextElement(); Stri

14种解决web字符编码问题

解决中文字符乱码的问题大致分为以下这几种: 1.jsp 页眉 设置 pageEncoding 为 "utf-8" 2..jsp 页眉 设置 contentType="text/html;charset=UTF-8" 3.Window >>> preferences >>> Workspace 工作区设置 编码格式:UTF-8 4.Window >>> preferences >>> Genera

解决出现乱码substr截取中文字符 siluke123

siluke123< ?php echo mb_substr('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');?>输出:这样一来我的字< ?phpecho mb_strcut('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');?>输出:这样 string mb_strcut ( string $str , int $start [, int $length [, string $encoding ] )mb_strcut() 和 m

mysql中采用concat来拼接中文字符乱码解决方式(转)

mysql中采用concat来拼接中文字符乱码解决方式 - fuxuejun的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/fuxuejun/article/details/6284725 mysql concat乱码问题解决 concat(str1,str2) 当concat结果集出现乱码时,大都是由于连接的字段类型不同导致,如concat中的字段参数一个是varchar类型,一个是int类型或doule类型,就会出现乱码. 解决方法:利用mysql的字符

解决osg路径与文件名中的中文字符问题

转至:http://blog.csdn.net/zhuqinglu/article/details/2064013 在打开或者保存一个osg模型的时候,经常遇到中文路径或者中文文件名的问题,此时会提示无法打开或者保存.当然,我们可以完全避免它,直接不使用中文字符,可是客户是苛刻的,有些小问题是必须解决的. 假设你想把node节点保存到E盘下的保存目录中,重新命名为牛.ive 此时只需调用一下代码: setlocale( LC_ALL, "chs" ); osgDB::writeNode