<?php
/*
@UTF-8编码的字符可能由1~3个字节组成。 */
/*--------------------------方法一截取中文字符串方法------------------------------*/
function msubstr($str, $start, $len)
{
$tmpstr = "";
$strlen = $start + $len;
for ($i = 0; $i < $strlen; $i++) {
if (ord(substr($str, $i, 1)) > 0xa0) //ord()函数返回字符串的第一个字符的ASCII值
{
$tmpstr .= substr($str, $i, 2);
$i++;
} else {
$tmpstr .= substr($str, $i, 1);
}
}
return $tmpstr;
} /*----------------------------第二种方法-----------------------------------*/
//截取的是UTF-8字符串
function utf_substr($str, $len)
{
$new_str = [];
for ($i = 0; $i < $len; $i++) {
$tem_str = substr($str, 0, 1);
if (ord($tem_str > 127)) {
$i++;
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);//join()函数把数组元素组合为一个字符串
} /*-------------------------------------第三种方法(UTF-8)--------------------------------*/
function cutstr($string, $length)
{
preg_match_all("/[\x01-\x7f]|[\xc2-\xdf]|[\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/", $string, $info);
$wordscut = "";
$j = 0;
for ($i = 0; $i < count($info[0]); $i++) {
$wordscut .= $info[0][$i];
$j = ord($info[0][$i]) > 127 ? $j + 2 : $j + 1;
if ($j > $length - 3) {
return $wordscut . "...";
}
}
return join('', $info[0]);
} $string = "312哈哈,这个组合很难切割哦";
echo cutstr($string, 10); /*---------------------------------下面是曾经用过的截取第三个的字符串的------------------------------*/
// $name1 = mysql_result($my_rst,0,"name");
// $name = preg_match("/([1-9][0-9]+)/",$name1,$r);
// $name = $r[0];
// if($name == ""){
// $name=preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,2}'.
// '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,1}).*#s',
// '$1',$name1);
// } /*--------------------------------------------第四种方法(UTF-8)---------------------------------------------*/
function cut_str($sourcestr, $cutlength)
{
$returnstr = '';
$i = 0;
$n = 0;
$str_length = strlen($sourcestr);//字符串的字节数
while ($n < $cutlength && $i <= $str_length) {
$temp_str = substr($sourcestr, $i, 1);
$ascnum = ord($temp_str);//得到字符串中第$i位字符的ASCII码
if ($ascnum >= 224) {
$returnstr = $returnstr . substr($sourcestr, $i, 3);//根据UTF-8编码规范,将3个连续的字符计为单个字符
$i = $i + 3;//实际Byte记为3
$n++;//字串长度为1
} elseif ($ascnum >= 192)//如果ASCII位高于192
{
$returnstr = $returnstr . substr($sourcestr, $i, 2);//根据UTF-8编码规范,将2个连续的字符记为单个字符
$i = $i + 2;//实际Byte记为2
$n++;//字串长度为1
} elseif ($ascnum >= 65 && $ascnum <= 90)//如果是大写字母
{
$returnstr = $returnstr . substr($sourcestr, $i, 1);
$i = $i + 1;//byte记为1
$n++;//但考虑到整体美观,大写字母计成一个高位字符
} else {
$returnstr = $returnstr . substr($sourcestr, $i, 1);
$i = $i + 1;//实际的Byte记为1
$n = $n + 0.5;//小写字母和半角标点等与半个高位字符宽...
}
}
if ($str_length > $cutlength) {
$returnstr = $returnstr . "...";//超过长度时在尾处加上省略号
}
return $returnstr;
} /*--------------------第五种方法(UTF-8)---------------------------------------------*/ function FSubstr($title, $start, $len = "", $magic = true)
{
if ($len == "") $len = strlen($title); if ($start != 0) {
$startv = ord(substr($title, $start, 1));
if ($startv >= 128) {
if ($startv < 192) {
for ($i = $start - 1; $i > 0; $i--) {
$tempv = ord(substr($title, $i, 1));
if ($tempv >= 192) break;
}
$start = $i;
}
}
} if (strlen($title) <= $len) return substr($title, $start, $len); $alen = 0;
$blen = 0;
$realnum = 0;
$length = 0;
for ($i = $start; $i < strlen($title); $i++) {
$ctype = 0;
$cstep = 0; $cur = substr($title, $i, 1);
if ($cur == "&") {
if (substr($title, $i, 4) == "&lt;") {
$cstep = 4;
$length += 4;
$i += 3;
$realnum++;
if ($magic) {
$alen++;
}
} elseif (substr($title, $i, 4) == "&gt;") {
$cstep = 4;
$length += 4;
$i += 3;
$realnum++;
if ($magic) {
$alen++;
}
} elseif (substr($title, $i, 5) == "&amp;") {
$cstep = 5;
$length += 5;
$i += 4;
$realnum++;
if ($magic) {
$alen++;
}
} elseif (substr($title, $i, 6) == "&quot;") {
$cstep = 6;
$length += 6;
$i += 5;
$realnum++;
if ($magic) {
$alen++;
}
} elseif (preg_match("/&#(\d+);?/i", substr($title, $i), $match)) {
$cstep = strlen($match[0]);
$length += strlen($match[0]);
$i += strlen($match[0]) - 1;
$realnum++;
if ($magic) {
$blen++;
$ctype = 1;
}
}
} else {
if (ord($cur) >= 252) {
$cstep = 6;
$length += 6;
$i += 5;
$realnum++;
if ($magic) {
$blen++;
$ctype = 1;
}
} elseif (ord($cur) >= 248) {
$cstep = 5;
$length += 5;
$i += 4;
$realnum++;
if ($magic) {
$ctype = 1;
$blen++;
}
} elseif (ord($cur) >= 240) {
$cstep = 4;
$length += 4;
$i += 3;
$realnum++;
if ($magic) {
$blen++;
$ctype = 1;
}
} elseif (ord($cur) >= 224) {
$cstep = 3;
$length += 3;
$i += 2;
$realnum++;
if ($magic) {
$ctype = 1;
$blen++;
}
} elseif (ord($cur) >= 192) {
$ctype = 2;
$length += 2;
$i += 1;
$realnum++;
if ($magic) {
$blen++;
$ctype = 1;
}
} elseif (ord($cur) >= 128) {
$length += 1;
} else {
$cstep = 1;
$length += 1;
$realnum++;
if ($magic) {
if (ord($cur) >= 65 && ord($cur) <= 90) {
$blen++;
} else {
$alen++;
}
}
}
}
if ($magic) {
if (($blen * 2 + $alen) == ($len * 2)) break;
if (($blen * 2 + $alen) == ($len * 2) + 1) {
if ($ctype == 1) {
$length -= $cstep;
break;
} else {
break;
}
}
} else {
if ($realnum == $len) break;
}
}
unset($cur);
unset($alen);
unset($blen);
unset($realnum);
unset($ctype);
unset($cstep); return substr($title, $start, $length);
}
function utf8Substr($str, $from, $len)
{
return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,' . $from . '}' .
'((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,' . $len . '}).*#s',
'$1', $str);
} $title = "你哈珀niad1纳斯达wop asdni你爱谁都没阿斯顿撒旦12ccs- sd"; $title = utf8Substr($title, 0, 15);
echo $title;

?>

PHP切割汉字的更多相关文章

  1. java按照字节切割字符串,解决汉字的问题

    编写一个截取字符串的函数,输入为一个字符串,截取开始地址,截取字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个, 如“我ABC”,0,4,应该截为“我AB”,输入“我ABC汉DEF”,1, ...

  2. python生成汉字图片字库

    最近做文档识别方面的项目,做汉字识别需要建立字库,在网上找了各种OCR,感觉都不好,这方面的技术应该比较成熟了,OCR的软件很多,但没有找到几篇有含金量量的论文,也没有看到哪位大牛公开字库,我用pyg ...

  3. 黄聪:PHP字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、切割成数组等)

    一.字符串替换 str_replace("iwind", "kiki", "i love iwind, iwind said"); 将输出 ...

  4. C#量转换为汉字表达

    /* 创造者:菜刀打好博客  * 创建日期: 2014年09一个月04号码  * 特征:Money类型转换  *  */ namespace Net.String.ConsoleApplication ...

  5. 【OCR技术系列之二】文字定位与切割

    要做文字识别,第一步要考虑的就是怎么将每一个字符从图片中切割下来,然后才可以送入我们设计好的模型进行字符识别.现在就以下面这张图片为例,说一说最一般的字符切割的步骤是哪些. 当然,我们实际上要识别的图 ...

  6. 【OCR技术系列之四】基于深度学习的文字识别(3755个汉字)

    上一篇提到文字数据集的合成,现在我们手头上已经得到了3755个汉字(一级字库)的印刷体图像数据集,我们可以利用它们进行接下来的3755个汉字的识别系统的搭建.用深度学习做文字识别,用的网络当然是CNN ...

  7. OCR技术浅探 : 文字定位和文本切割(2)

    文字定位 经过前面的特征提取,我们已经较好地提取了图像的文本特征,下面进行文字定位. 主要过程分两步: 1.邻近搜索,目的是圈出单行文字: 2.文本切割,目的是将单行文本切割为单字. 邻近搜索 我们可 ...

  8. 光学字符识别OCR-5 文本切割

    经过前面文字定位得到单行的文本区域之后,我们就可以想办法将单行的文本切割为单个的字符了.因为第三步的模型是针对单个的字符建立的,因此这一步也是必须的. 均匀切割 基于方块汉字的假设,事实上最简单的切割 ...

  9. 【OCR技术系列之二】文字定位于切割

    要做文字识别,第一步要考虑的就是怎么将每一个字符从图片中切割下来,然后才可以送入我们设计好的模型进行字符识别.现在就以下面这张图片为例,说一说最一般的字符切割的步骤是哪些. 当然,我们实际上要识别的图 ...

随机推荐

  1. .NET混合开发解决方案16 管理WebView2的用户数据

    系列目录     [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...

  2. CesiumJS 2022^ 原理[5] - 着色器相关的封装设计

    目录 1. 对 WebGL 接口的封装 1.1. 缓冲对象封装 1.2. 纹理与采样参数封装 1.3. 着色器封装 1.4. 上下文对象与渲染通道 1.5. 统一值(uniform)封装 1.6. 渲 ...

  3. 1.0 vue开篇之作

    vue官网链接:https://cn.vuejs.org/ 一. vue简介 vue目前分为2.X版和3.X版,本文以2.X版为准,后续会更新3.X版本相关教程,建议从2.X版开始学起,因为此版本经过 ...

  4. unity---点击事件

    点击事件 点击触发的事件脚本 脚本挂载方式 On Click() 如果点击后触发,调用Button物体下,Button_lick脚本中的func函数/func_text 结果

  5. Vue路由的安装

    1.在Vue ui中插件中找到添加vue-router 2.安装以后,项目中的会自动完成配置. 3.在store中的index.js配置路由页面以及路径.

  6. C# 蓄水池抽样

    蓄水池采样算法解决的是在给定但长度未知的大数据集中,随机等概率抽取一个数据.如果知道数据的长度,可以用随机数rand()%n得到一个确切的随机位置,或者分块取值来构造随机,那么该位置的对象就是所求的对 ...

  7. Spark: 单词计数(Word Count)的MapReduce实现(Java/Python)

    1 导引 我们在博客<Hadoop: 单词计数(Word Count)的MapReduce实现 >中学习了如何用Hadoop-MapReduce实现单词计数,现在我们来看如何用Spark来 ...

  8. MySQL锁(乐观锁、悲观锁、多粒度锁)

    锁 并发事务可能出现的情况: 读-读事务并发:此时是没有问题的,读操作不会对记录又任何影响. 写-写事务并发:并发事务相继对相同的记录做出改动,因为写-写并发可能会产生脏写的情况,但是没有一个隔离级别 ...

  9. Docker容器编译安装Nginx

    Docker容器编译安装Nginx,最简单的Nginx配置. 创建容器&进入容器 宿主机2080映射容器的80端口 [root@localhost ~]# docker run -i -d - ...

  10. 如何优雅的使用MyBatis?

    ​本文目录 什么是 MyBatis ? 映射器(mappers) typeAliases 类型别名减少类完全限制名的冗余 处理枚举类型 多行插入 重用 SQL 代码段,消除重复 字符串替换#{}和${ ...