分析字符的问题

分析字符的问题

分析字符的问题
刚开始学perl遇到的一个小问题
一篇中文文章中摘了若干个字串出来,每个串固定的字符个数,一个中文字占2个字符,取出的这一行字的头和尾很有可能是正好截到一个字中间,这样打印出来就是乱码,我想检测出所有的这种情况,如果有这种情况直接把多余的半个字删除。该怎么样在perl低下实现呢?
大家帮帮忙,谢谢啦!!
是GBK编码吗?可以根据编码.
是GBK编码吗?可以根据编码范围判断一下最后一个字节的数据是否GBK编码规则,如果是则直接删除.
好,我先去查查GBK编码是咋回事:)
use encoding 'gbk';.
use encoding 'gbk';
如果你的中文字符串是写在.
如果你的中文字符串是写在程序里的(比如赋值给某个变量的字符串里面包含中文),那么 use encoding "euc-cn" 就可以了

如果你是从外部文件读入的中文(gb2312或者gbk编码),那么请参考如下代码[quote]#!/usr/bin/perl
# cnhackTNT { A T } perlchina.org

[color=red]use encoding "utf8",STDOUT=>"euc-cn";[/color]

open(FH,[color=red]"<:encoding(gb2312)"[/color],"test.txt") or die $!;
$content = <FH>;
close FH;

$str = substr($content,1,5); # 跳过 $content 中的第一个字符,截取之后的5个字符
print $str;[/quote]
gb2312 编码的 test.txt 内容为:[quote]瓦2万发放23424俄三方we[/quote]
程序输出为:[quote]2万发放2[/quote]
没有发生截断,得到的结果符合预期 :-)
第二种情况还可以用 Encode 模块来解决,效果一样
楼主可以看看 perldoc encoding 或者 perldoc Encode

ps: 如果要使用判断字符码范围的方式来截取多余字节,gb2312 汉字编码的范围是:第一个字节 B0-F7,第二个字节 A0-FE




   

(:谢谢各位,这下完全搞明.
(:谢谢各位,这下完全搞明白了~~~
[quote]回复给 cnhacktnt .
[quote]回复给 cnhacktnt : 如果你的中文字符串是写在....[/quote]
又出了点问题,用的encoding的方法,用substr抽取时没问题,可是我用了正则表达式就不行了

if(m:(.{10})(北京/ns)(.{10}):)

报错说malfomed UTF-8 charactor...
原来TNT写代码不喜欢用use.
原来TNT写代码不喜欢用use strict;的.

此法也可以用来解决此论坛的显示乱码哈.
回 gill : 正则中如果有中.
回 gill : 正则中如果有中文,最好的方式是把中文字符附值给一个变量,然后在正则中以 这样的方式使用这个变量:[quote]\Q$chinese_chars\E[/quote]

回 beckheng: 一般短短的或者是调试用的代码如果没有必要我就不用 strict 了呵呵
[quote]回复给 cnhacktnt .
[quote]回复给 cnhacktnt : 回 gill : 正则中如果有中....[/quote]
似乎问题不在这里,加上\Q\E限定结果还是一样的,
之前的程序我把有关于encoding模块的语句去掉执行起来就没有问题,(但是会出现截取半个字符的问题)可是加了就不行了
错误好像还是在字符和字节识别上面

错误是这样的(在正则表达式那一行):
[quote]Malformed UTF-8 character (unexpected continuation byte 0xa9, with no preceding start byte)[/quote]
出现了若干次类似的

好像是正则表达式还是在识别字节而不是unicode字符

这样子有没有什么好办法解决呢?头疼阿~