23 November 2004
This post may be outdated due to it was written on 2004. The links may be broken. The code may be not working anymore. Leave comments if needed.
坦白说,以下的东西我不是很懂。只是在做实验。这份就类似于实验纪录。

ord,unpack("*H",hex,chr

my $c = "我";

print unpack("H*",$c); # 输出 ced2, 此为汉字编码\xcede
print ord("$c")"; # 输出 206
print hex(substr(unpack("H*",$c),0,2)); # 输出 206, hex("ce") = 206
print chr(0xce),chr(0xd2); # 输出“我”,chr(0xced2)输出的字为“旎”。原因不可考。

汉字编码范围

参考文章:http://www.douzi.org/weblog/archives/2004_03.html
编码第一字节第二字节第三字节第四字节
GB23120xB0-0xF70xA0-0xFE
GBK0x81-0xFE0x40-0xFE
GB18030的双字节0x81-0xFE0x40-0x7E, 0x80-0xFE
GB18030的四字节0x81-0xFE0x30-0x390x81-0xFE0x30-0x39
一般来说,需要支持的是GBK,而GB18030的双字节与GBK仅差一条线,XX7F。所以一般的汉字匹配为
$chinese =~ /^[\x8140-\xFEFE]+$/;
这里所匹配的不是全是汉字,还包括非汉字符号,还有用户自定义字符区。
这东西真不是一般麻烦。

常见的两个空白字的过滤

一个字“ ”是中文简体输入法在全角格式下的空格,编码为a1a1。
另一个字“”不知道怎么输入的?可能是繁体输入法的,编码为aba7。
其实还有一大段区域属于用户自定义区域,此区域内的字在网页上显示都为占两字节的空格。一般用户名的注册是需要过滤这些空格的。这范围我还没找到。
$text =~ s/ //g;
$text =~ s///g;
#或者使用如下的过滤
$text =~ s/(\xa1\xa1)|(\xab\xa7)//g;


blog comments powered by Disqus