文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Perl中文字符截取就这么简单

Perl中文字符截取就这么简单

时间:2006-08-29  来源:coolend

需要对比较长的行(含中文字符)强制换行,以便在网页上正常显示,不至于破坏整个页面布局,通过 CSS 似乎可以做到这点,不过对 Firefox 好像没什么作用,所以干脆用程序处理好了。

网上找了好几个脚本,都不能用,而且都比较复杂,经过一番研究,发觉了一个简单而可行的方法。其原理是:截取指定长度字符串,然后删除字符串中所有非中文字符,并计算剩余中文字符的长度,我的中文是UTF-8编码,每个汉字长度为3个字节,如果发现长度不是3的整数倍,则表示截取字符串中包含中文乱码,此时删除多余的字符(少截取一点点)。

下面的程序是对输入字符串进行分割,分割的地方插入<br>,然后输出。

代码如下:

#!/usr/bin/perl

use strict;

sub substring() {
    my ($str, $maxlen) = @_;
    my $trim = 0;
    return $str if (length($str) <= $maxlen);

    ### Count length of chinese charaters
    (my $cn = substr($str,0,$maxlen)) =~ s/[^\x7f-\xff]//g;

    ### if the length is not the multiple of 3, trim the redundant chars
    $trim = length($cn) % 3;

    ### get the substring
    my $retval = substr($str,0,$maxlen-$trim);

    ### recursion to get the remain string
    return "$retval<br>" . &substring(substr($str,$maxlen-$trim),$maxlen);
}

my $str = "一个很long很长很长很长的string, 要分割以便能正常显示";
print &substring($str,15) . "\n";

输出:
    一个很long<br>很长很长很<br>长的string, <br>要分割以便<br>能正常显示

=======================================================================
## 感谢 hzqbbc 兄的指点,更简单的办法:

$len = 15;
Encode::_utf8_on($str);
while (my $sub = substr($str, 0, $len)) {
Encode::_utf8_off($sub);
print "$sub\n";
$str = substr($str, $len);
}

### 后来,在 Google 上找了找 Encode 相关资料,发现配合 pack/unpack 也可以达到这个目的
### 字符串在 unpack 和 pack 后,utf8 标记已经去掉了
$len = 15;
Encode::_utf8_on($str);
while (my $sub = substr($str, 0, $len)) {
print pack("b*",unpack("b*",$sub)) . "\n";
$str = substr($str, $len);
}
相关阅读 更多 +
排行榜 更多 +
独角兽装扮物语

独角兽装扮物语

休闲益智 下载
多格和迷失的猫

多格和迷失的猫

休闲益智 下载
模拟赛车精英

模拟赛车精英

赛车竞速 下载