php的ord函数——解决中文字符截断问题
函数是这样定义的:
$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
- $a = "jf我们de没";
- /**
- * @brief
- *
- * @param $str 待截取的字符串
- * @param $start 字符串开始位置
- * @param $num 截取到多长的字符串
- *
- * @return
- */
- function utf8_substr($str, $start, $num){
- $res = ''; //存储截取到的字符串
- $cnt = 0; //计数器,用来判断字符串是否走到$start位置
- $t = 0; //计数器,用来判断字符串已经截取了$num的数量
- for($i = 0; $i < strlen($str); $i++){
- if(ord($str[$i]) > 127){ //非ascii码时
- if($cnt >= $start){ //如果计数器走到了$start的位置
- $res .=$str[$i].$str[++$i].$str[++$i]; //utf-8是三字节编码,$i指针连走三下,把字符存起来
- $t ++; //计数器++,表示我存了几个字符串了到$num的数量就退出了
- }else{
- $i++; //如果没走到$start的位置,那就只走$i指针,字符不用处理
- $i++;
- }
- $cnt ++;
- }else{
- if($cnt >= $start){ //acsii码正常处理就好
- $res .=$str[$i];
- $t++;
- }
- $cnt ++;
- }
- if($num == $t) break; //ok,我要截取的数量已经够了,我不贪婪,我退出了
- }
- return $res;
- }
- var_dump(utf8_substr($a, 3, 10)); //结果应该是你想要的
- ?>
版权声明:本文为博主原创文章,未经博主允许不得转载。
php的ord函数——解决中文字符截断问题的更多相关文章
- 解决IAR printf函数输出中文字符乱码问题
首先看一下IAR的中文字符的坑 这会对调试造成很大的干扰,因为眼见不一定为实. 你所期望的中文打印输出都成了乱码,心在滴血.... 解决方法详细,纯属个人摸索 1.新建notepad++文件,编码方式 ...
- Python中的解决中文字符编码的问题
python3中str默认为Unicode的编码格式 python2中str默认为bytes类型的编码格式 Unicode是一32位编码格式,不适合用来传输和存储,所以必须转换成utf-8,gbk等等 ...
- Python解决中文字符的问题
from __future__ import unicode_literals print(type("test")) #<type 'unicode'> Chinat ...
- Servlet & JSP - 中文字符问题
Servlet 中的中文字符 来自 URL 参数部分的中文字符 Tomcat 默认接收数据的编码是 ISO-8859-1.所以当请求 URL 的参数部分含有中文字符,需要转换字符的编码. Enumer ...
- php输出中文字符
中文字符不可以使用imagettftext()函数在图片中直接输出,如果要输出中文字符,需要先使用iconv()函数对中文字符进行编码,语法格式如下:string iconv ( string $in ...
- 判断一个python字符串中是否包含中文字符
#在python中一个汉字算一个字符,一个英文字母算一个字符 #用 ord() 函数判断单个字符的unicode编码是否大于255即可. def is_contain_chinese(check_st ...
- PHP用mb_string函数库处理与windows相关中文字符
昨天想批处理以前下载的一堆文件,把文件里的关键内容用正则匹配出来,集中处理.在操作文件时遇到一个问题,就是windows操作系统中的编码问题. 我们都知道windows中(当然是中文版),文件名和文件 ...
- 解决osg路径与文件名中的中文字符问题
转至:http://blog.csdn.net/zhuqinglu/article/details/2064013 在打开或者保存一个osg模型的时候,经常遇到中文路径或者中文文件名的问题,此时会提示 ...
- php中url传递中文字符,特殊危险字符的解决方法
php中的urldecode,base64_encode函数然后再结合自己写的替换函数来进行安全传递url中文字符,特殊危险字符. 需要在url中传递中文字符或是其它的html等特殊字符,似乎总会有各 ...
随机推荐
- Python性能优化:PyPy、Numba 与 Cython。PyPy的安装及对应pip的安装
性能优化讨论见参考1:大概意思是,PyPy内置JIT,对纯Python项目兼容性极好,几乎可以直接运行并直接获得性能提升:缺点是对很多C语言库支持性不好.Numba是一个库,可以在运行时将Python ...
- LinuxMint19/LMDE3安装后的设置
LinuxMint 安装后进行一些设置. 1.设置主板时间为本地时间,默认为UTC时间,与Windows不同,如果双系统,时间有时差. sudo timedatectl set-local-rtc t ...
- 数学图形(2.14)Spherical helix曲线
从http://mathworld.wolfram.com/SphericalHelix.html上找到如下一些关于该曲线的说明,不过似乎他的公式和我的脚本完全是两个东西.. The tangent ...
- RSA大会播报 – 2014最佳安全博客提名
今年美国RSA大会将在这个月的23-28号举行,每年大会上都会评出过去一年来业内最佳安全博客(Security Bloggers Network Social Security Awards 2014 ...
- Oracle数据库导入dmp文件报错处理方法
在向oracle数据库执行导入命令的时候报错,错误如下,大概意思是TNS中找不到服务名 下面说一下解决步骤 1:进入oracle用户,使用cat查看.bash_profile文件,找到ORACLE_H ...
- [Compose] 9. Delay Evaluation with LazyBox
We rewrite the Box example using lazy evaulation. Here is Box example: const Box = (x) => ({ map: ...
- 如何用 js 递归输出树型
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- LeetCode 303 Range Sum Query - Immutable(范围总和查询-永久不变)(*)
翻译 给定一个整型数组nums,找出在索引i到j(i小于等于j)之间(包含i和j)的全部元素之和. 比如: 给定nums = [-2,0,3,-5,2,-1] sumRange(0, 2) -> ...
- Android Service+Socket 联网交互
android中,联网操作有http连接和socket连接两大类.由于项目需要,我们采取的是Socket连接.鉴于平时连接频繁,因此把Socket连接放到Service里,需要从服务器端获取数据时,只 ...
- 解压zip,解决中文乱码
Project p = new Project(); Expand e = new Expand(); e.setProject(p); e.setSrc(f ...