`
waiting
  • 浏览: 235461 次
  • 性别: Icon_minigender_1
  • 来自: cq
社区版块
存档分类
最新评论

PHP UTF-8 等宽度截取中英文字符

    博客分类:
  • PHP
阅读更多
网站需要截取等宽新闻标题,对于GB编码的截取函数网上很多,没找到有适合UTF-8编码的。 考虑到UTF-8是1-4字节变长编码,虽然中文都是3字节,为了以后方便决定自己写个。

截取的变量是宽度width而不是长度length。不同中英文(包括数字)字型搭会有不同显示效果,在不同显示器上相同字型也可能会有不同效果。 需要根据实际修改 x3变量的值,x3越大则3字节编码(如中文)字符就取得越少。 全中文与全英文/数字截取显示宽度差异最大,且截取宽度值越大越明显。 中英文混排情况时差异较小。


/**
 * 截取UTF8编码字符串从首字节开始指定宽度(非长度), 适用于字符串长度有限的如新闻标题的等宽度截取
 * 中英文混排情况较理想. 全中文与全英文截取后对比显示宽度差异最大,且截取宽度远大越明显.
 * @param string $str	UTF-8 encoding
 * @param int[option] $width 截取宽度
 * @param string[option] $end 被截取后追加的尾字符
 * @param float[option] $x3<p>
 * 	3字节(中文)字符相当于希腊字母宽度的系数coefficient(小数)
 * 	中文通常固定用宋体,根据ascii字符字体宽度设定,不同浏览器可能会有不同显示效果</p>
 *
 * @return string
 * @author waiting
 * http://waiting.iteye.com
 */
function u8_title_substr($str, $width = 0, $end = '...', $x3 = 0) {
	global $CFG; // 全局变量保存 x3 的值
	if ($width <= 0 || $width >= strlen($str)) {
		return $str;
	}
	$arr = str_split($str);
	$len = count($arr);
	$w = 0;
	$width *= 10;

	// 不同字节编码字符宽度系数
	$x1 = 11;	// ASCII
	$x2 = 16;
	$x3 = $x3===0 ? ( $CFG['cf3']  > 0 ? $CFG['cf3']*10 : $x3 = 21 ) : $x3*10;
	$x4 = $x3;

	// http://zh.wikipedia.org/zh-cn/UTF8
	for ($i = 0; $i < $len; $i++) {
		if ($w >= $width) {
			$e = $end;
			break;
		}
		$c = ord($arr[$i]);
		if ($c <= 127) {
			$w += $x1;
		}
		elseif ($c >= 192 && $c <= 223) {	// 2字节头
			$w += $x2;
			$i += 1;
		}
		elseif ($c >= 224 && $c <= 239) {	// 3字节头
			$w += $x3;
			$i += 2;
		}
		elseif ($c >= 240 && $c <= 247) {	// 4字节头
			$w += $x4;
			$i += 3;
		}
	}

	return implode('', array_slice($arr, 0, $i) ). $e;
}



0
0
分享到:
评论

相关推荐

    PHP UTF-8 等宽度截取中英文字符.txt

    ### PHP UTF-8 等宽度截取中英文字符知识点详解 #### 一、背景介绍 在处理多语言文本时,尤其是中英文混排的情况下,如何精确地截取字符串成为一个常见的问题。对于UTF-8编码的字符串来说,由于不同字符(如中文、...

    php轻松实现中英文混排字符串截取

    然而,PHP提供了mb扩展,它包含了专门用于处理多字节字符集(如UTF-8)的函数,能够更加准确地处理中英文混排的字符串。 首先,我们来看`mb_strwidth()`函数。这个函数返回字符串的宽度,而不是长度。在中英文混排...

    中英文字符串翻转函数

    ### 中英文字符串翻转函数知识点解析 在编程领域中,处理多语言文本是常见的需求之一。对于中英文混合的字符串,实现其翻转功能时,需要考虑到不同字符宽度(例如,中文字符通常占用两个字节以上)的影响。下面将...

    PHP和Mysql中转UTF8编码问题汇总

    对于文章标题截断显示问题,当UTF-8编码格式的中文字符占用3个字符宽度时,截取标题可能会只截取到一个或两个字符宽度,导致乱码或问号的出现。此时可以通过编写一个函数来进行正确的截断处理。 2. MYSQL数据库使用...

    PHP HTML代码串 截取实现代码

    文本截取不仅仅是按照字节长度进行,因为在UTF-8编码中,中文字符通常占3个或4个字节,而在显示时可能被当作两个字符长度来处理。此外,与英文字符相比,中文字符和全角符号在显示时所占的空间不同,因此截取时需要...

    grub4dos-V0.4.6a-2017-02-04更新

    例如:echo -e \x18 显示 UTF-8 字符 0x18。 echo -e \X2191 显示 unicode 字符 0x2191。 2016-03-15(yaya) 1.增加动画控制热键 F2:播放/停止。 2.增加动画控制位 0x835b,位0:0/1=停止/播放。 3.增加精简...

    用CSS解决中英文混合字符串的截取省略问题的解决办法

    - **编码兼容性**:在不同的编码环境下(如GBK、UTF-8等),使用脚本语言处理中英文混合文本时容易出现乱码等问题。 - **维护成本**:需要额外编写和维护相关的处理逻辑,增加了项目的复杂度。 #### CSS解决方法...

    php简单统计中文个数的方法

    在例子中,`mb_strlen("你好ABC", 'UTF-8')`返回5,因为字符串中有3个中文字符和2个英文字符,总共5个字符。 另一个相关的函数是`mb_strwidth()`,它主要用于计算字符串在终端或显示器上占据的宽度。在中文环境下,...

    PHP实时统计中文字数和区别

    `strlen()`函数是最基础的字符串长度计算函数,它基于字节计算,因此对于UTF-8编码的中文字符,每个中文字符会被计为3个字节。例如,字符串 "你好ABC" 的 `strlen()` 结果为9,这是因为包含3个中文字符和3个英文字符...

    判断是否为指定长度内字符串的php函数

    1. **`mb_strlen`**:这个函数用于计算多字节字符(如UTF-8编码)的字符串长度。与`strlen`不同,`mb_strlen`可以正确处理非ASCII字符,比如中文、日文等。 2. **`str_pad`**:这个函数可以将字符串填充到指定长度...

    取字和字符的长度

    这里的“字”通常指的是中文字符,而“字符”可以指代任何语言的单个文字单元,包括英文字符、数字、标点符号等。理解和掌握如何计算字符串中的字和字符数量对于编写高效且准确的代码至关重要。 在不同的编程语言中...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用PHP进行Web开发的各个方面的知识和技巧,主要包括开发环境、PHP基础、Web页面交互、文件操作、会话应用、图形图像处理及面向对象等内容。...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用PHP进行Web开发的各个方面的知识和技巧,主要包括开发环境、PHP基础、Web页面交互、文件操作、会话应用、图形图像处理及面向对象等内容。...

    PHP几个实用自定义函数小结

    此函数允许开发者指定截取的长度,并可自定义省略号等提示信息,重要的是它支持中文字符,因为UTF-8编码下,一个中文字符可能占用两个字节。函数内部使用mb_strwidth来获取字符串宽度,这是因为在多字节编码中,一个...

Global site tag (gtag.js) - Google Analytics