PHP正确解析UTF-8字符串技巧应用
程序员文章站
2022-07-06 07:52:02
在《学习php&mysql之——字符编码篇(一)》中介绍了unicode与utf-8的转换关系,总结了一个utf-8的编码规则,根据这个编码规则,写一个utf-8编码的解析...
在《学习php&mysql之——字符编码篇(一)》中介绍了unicode与utf-8的转换关系,总结了一个utf-8的编码规则,根据这个编码规则,写一个utf-8编码的解析程序,以下是php的实现:
<?php
/*
程序功能,$str是中英文混合的utf-8编码字符串,
将此字符串根据utf-8的编码规则正确的解码并显示。
*/
$str = '今天非常happy,所有决定去kfc吃可乐鸡翅!!!';
/*
$str 是待截取的字符串
$len 是截取的字符数
*/
function utf8sub($str,$len) {
if($len <= 0){
return '';
}
$offset = 0; // 截取高位字节时的偏移量
$chars = 0; // 截取到的字符数
$res = ''; // 存放截取的结果字符串
while($chars < $len){
// 先取字符串的第一个字节
// 将它转为十进制
// 再转为二进制
$high = ord(substr($str,$offset,1));
// echo '$high='. $high .'<br />';
if($high == null ){ // 如果取出高位为null,证明已经取到末尾,直接break
break;
}
if(($high>>2) === 0x3f){ // 将高位右移2位,和二进制111111比较,相同则取6个字节
// 截取2个字节
$count = 6;
}else if(($high>>3) === 0x1f){ // 将高位右移2位,和二进制11111比较,相同则取5个字节
// 截取3个字节
$count = 5;
}else if(($high>>4) === 0xf){ // 将高位右移2位,和二进制1111比较,相同则取4个字节
// 截取4个字节
$count = 4;
}else if(($high>>5) === 0x7){ // 将高位右移2位,和二进制111比较,相同则取3个字节
// 截取5个字节
$count = 3;
}else if(($high>>6) === 0x3){ // 将高位右移2位,和二进制11比较,相同则取2个字节
// 截取6个字节
$count = 2;
}else if(($high>>7) === 0x0){ // 将高位右移2位,和二进制0比较,相同则取1个字节
$count = 1;
}
// echo '$count='.$count.'<br />';
$res .= substr($str,$offset,$count); // 取出一个字符与$res字符串连接
$chars += 1; // 截取到的字符数+1
$offset += $count; // 截取高位偏移量向后移$count字节
}
return $res;
}
echo utf8sub($str,100);
复制代码 代码如下:
<?php
/*
程序功能,$str是中英文混合的utf-8编码字符串,
将此字符串根据utf-8的编码规则正确的解码并显示。
*/
$str = '今天非常happy,所有决定去kfc吃可乐鸡翅!!!';
/*
$str 是待截取的字符串
$len 是截取的字符数
*/
function utf8sub($str,$len) {
if($len <= 0){
return '';
}
$offset = 0; // 截取高位字节时的偏移量
$chars = 0; // 截取到的字符数
$res = ''; // 存放截取的结果字符串
while($chars < $len){
// 先取字符串的第一个字节
// 将它转为十进制
// 再转为二进制
$high = ord(substr($str,$offset,1));
// echo '$high='. $high .'<br />';
if($high == null ){ // 如果取出高位为null,证明已经取到末尾,直接break
break;
}
if(($high>>2) === 0x3f){ // 将高位右移2位,和二进制111111比较,相同则取6个字节
// 截取2个字节
$count = 6;
}else if(($high>>3) === 0x1f){ // 将高位右移2位,和二进制11111比较,相同则取5个字节
// 截取3个字节
$count = 5;
}else if(($high>>4) === 0xf){ // 将高位右移2位,和二进制1111比较,相同则取4个字节
// 截取4个字节
$count = 4;
}else if(($high>>5) === 0x7){ // 将高位右移2位,和二进制111比较,相同则取3个字节
// 截取5个字节
$count = 3;
}else if(($high>>6) === 0x3){ // 将高位右移2位,和二进制11比较,相同则取2个字节
// 截取6个字节
$count = 2;
}else if(($high>>7) === 0x0){ // 将高位右移2位,和二进制0比较,相同则取1个字节
$count = 1;
}
// echo '$count='.$count.'<br />';
$res .= substr($str,$offset,$count); // 取出一个字符与$res字符串连接
$chars += 1; // 截取到的字符数+1
$offset += $count; // 截取高位偏移量向后移$count字节
}
return $res;
}
echo utf8sub($str,100);
上一篇: 上班路上
推荐阅读
-
PHP正确解析UTF-8字符串技巧应用
-
正确解读PHP应用odbc技巧_PHP教程
-
PHP正确解析UTF-8字符串_PHP教程
-
解析使用substr截取UTF-8中文字符串出现乱码的问题_PHP
-
解析php获取字符串的编码格式的方法(函数)_php技巧
-
解析php获取字符串的编码格式的方法(函数)_php技巧
-
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法_php技巧
-
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法_php技巧
-
解析使用substr截取UTF-8中文字符串出现乱码的问题_php技巧
-
解析使用substr截取UTF-8中文字符串出现乱码的问题_PHP教程