需要对比较长的行(含中文字符)强制换行,以便在网页上正常显示,不至于破坏整个页面布局,通过 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);
}
阅读(3684) | 评论(0) | 转发(1) |