Chinaunix首页 | 论坛 | 博客
  • 博客访问: 499598
  • 博文数量: 401
  • 博客积分: 244
  • 博客等级: 入伍新兵
  • 技术积分: 2215
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-04 10:02
文章分类

全部博文(401)

文章存档

2013年(37)

2012年(364)

分类:

2012-12-19 19:10:46

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

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

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

代码如下:

#!/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
" . &substring(substr($str,$maxlen-$trim),$maxlen);
}

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

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

=======================================================================
## 感谢 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);
}


阅读(426) | 评论(0) | 转发(0) |
0

上一篇:xpath学习整理

下一篇:Perl字符串处理

给主人留下些什么吧!~~