求教高人非常难的utf-8编码中文截断问题!!!

求教高人非常难的utf-8编码中文截断问题!!!

求教高人非常难的utf-8编码中文截断问题!!!
看过hedong的"支持GB2312和UTF8两种编码的Trackback"这篇文章后,同时发现一个问题,我原来的程序有个函数是对中英文混排的字串是行截断的,在UTF8下不能正常工作了,可能是因为汉字的编码类型改变及编码长度变成3个吧,不知道各位大侠对此有什么看法?

附上字串截断函数,来自leobbs论坛.
#将字符串规范为指定长度
sub specify_strlength($$)
{
my($this_str, $max_length) = @_;
return $this_str if(length($this_str)<=$max_length);
return (substr($this_str, 0,
$max_length)=~/^([\000-\177]|[\200-\377][\200-\377])*([\000-\177]|[\200-\377][\200-\377])$/)
? substr($this_str, 0, $max_length) : substr($this_str, 0, $max_length
- 1);
}

解决方法:
use Encode qw /encode decode/;
my $text = decode ('utf8', '测试中文');

for (my $i=0;$i<length ($text);$i++)
{
print encode ('utf8', substr ($text, $i, 1));
print "\n";
}

出现的新问题,字符串对齐问题,utf8一个中文占用的长度为3,英文为1,这里使用上述的解决方法,假如字串中混杂中文,在网页显示布局上会有问题...




   

UTF8的话,事先 use utf8; .
UTF8的话,事先 use utf8; 加载该模块或者用 Encode 模块的 decode_utf8() 告诉 perl 处理的数据是 UTF8 编码,然后 utf8 编码的数据无论中文英文数字,都可以一个一个字符的 substr 或者其他处理了,用不着正则这么费劲的匹配
前提是外部的需要处理的数据均为 utf8 编码
[quote]回复给 cnhacktnt .
[quote]回复给 cnhacktnt : UTF8的话,事先 use utf8; ....[/quote]

已经是这么处理的了,可还是不行,substr处理中文时仍像把中文载断了.
现在偶用的方法是ut8转成g.
现在偶用的方法是ut8转成gb2312后,截断后再转成utf-8...哪位有好的方面请指教一下...

my $converter = Text::Iconv->new("UTF-8", "GB2312");
$text = $converter->convert(text);
$text = &specify_strlength($text,170)." ...";
$converter = Text::Iconv->new("GB2312", "UTF-8");
$text = $converter->convert($quotation);
#use utf8;
#$text = substr($text,0,2);
#no utf8;
#$quotation = utf8::encode($quotation);
[quote]UTF8的话,事先 use.
[quote]UTF8的话,事先 use utf8; 加载该模块或者用 Encode 模块的 decode_utf8() 告诉 perl 处理的数据是 UTF8 编码,然后 utf8 编码的数据无论中文英文数字,都可以一个一个字符的 substr 或者其他处理了,用不着正则这么费劲的匹配
前提是外部的需要处理的数据均为 utf8 编码
[/quote]
[quote]已经是这么处理的了,可还是不行,substr处理中文时仍像把中文载断了.[/quote]
你弄错我的意思了,仔细看看~
若非指定,PERL 对外来数据一律当作字节流处理,才不管什么文字编码,要告诉 perl 外部数据是什么编码,以[quote] decode '编码方式',$变量;
# (你的数据是utf8编码,所以我说可以用 decode_utf8这个专门的函数)[/quote] ,这样 Perl 就在内部语义上将其转换成 unicode 来处理(物理上存储在内存中还是 utf8 格式),这样原来那堆一个字节一个字节的字节流对 perl 来说就变成了有语义(意义)的字符串,perl 就知道哪几个字节放在一起是个 unicode 字符,所以 substr 的时候,如果是一个字符,那就不会冤枉它截断它
其实后面 anthony 给出的例子正是这个意思,只不过他以 big5 码为例(不好意思事先我没给出例子,因为我以为你会看 perldoc utf8 或者 perldoc Encode 等相关文档)




   

[quote]回复给 anthony : .
[quote]回复给 anthony : [quote]回复给 nsnake : u....[/quote]
WINXP SP2英文版
忘记了GB2132和BIG5不是一回事
谢谢提醒
decode ('utf-8', '测试中.
decode ('utf-8', '测试中文');
我还是用utf-8来解决的,只是学习了big5码的处理方法

以前处理gb2312中文2字符宽的方法处理习惯了,目前把一个中文当成一个字来算反倒不习惯,对齐方式也出问题了.在面页布局上反倒不好控制了...还真麻烦...
[quote]回复给 cnhacktnt .
[quote]回复给 cnhacktnt : [quote]因为我以为你会看 perldoc utf8 或者 perldoc Encode 等相关文档)[/quote]

文档看过,但还是没有搞懂怎么用,后面那种方法似乎简单些...
晕,转成ucs2格式,所有的.
晕,转成ucs2格式,所有的英文或汉字都是两字节的,这样随便你怎么切只要切的时候是2的整数倍就可以了,切后再转成UTF-8就可以了。