Chinaunix首页 | 论坛 | 博客
  • 博客访问: 596955
  • 博文数量: 40
  • 博客积分: 7274
  • 博客等级: 少将
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-20 15:00
个人简介

Expired

文章分类
文章存档

2011年(1)

2008年(3)

2007年(17)

2006年(10)

2005年(9)

分类: LINUX

2006-08-29 19:49:31

需要对比较长的行(含中文字符)强制换行,以便在网页上正常显示,不至于破坏整个页面布局,通过 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) |
给主人留下些什么吧!~~