中文双字节编码vs正则表达式

中文双字节编码vs正则表达式

$tmp="中文";
print $tmp=~ m/形/;
结果等于1
使用encoding
use   encoding   'cp936',   STDIN   =>   'cp936',   STDOUT   =>   'cp936';
结果就正常了.

如果不使用encoding,有没有好的方法解决这个问题呢.
你那个是什么字,看起来怪怪的
"中文"中的"中"字的右编码,和"文"字的左编码,正好组成了"形"字.
在gbk编码中
"中"字的编码是:d6  d0
"文"字的编码是:ce  c4

而d0 ce 是"形" 字的编码
# locale
LANG=zh_CN.GBK
LC_CTYPE="zh_CN.GBK"
LC_COLLATE="zh_CN.GBK"
LC_TIME="zh_CN.GBK"
LC_NUMERIC="zh_CN.GBK"
LC_MONETARY="zh_CN.GBK"
LC_MESSAGES="zh_CN.GBK"
LC_ALL=
这个case应该比较让人激动,哈哈
http://bbs.chinaunix.net/viewthread.php?tid=100824
http://bbs.chinaunix.net/viewthread.php?tid=103329

方法1:
先用unpack將string編碼成hex的數字..
然後兩碼兩碼抓出來檢查....
找出GB2312中文字的起始與終止hex編碼為多少...
然後就知抓出來的編碼是不是中文字...
等全部中文字都抓出來了,再pack為中文...

方法2:
英文的可显示字符的ASCII码的范围是32<x<128, 而汉字是双字节编码,汉字编码的第一字节的ASCII是大于127的应用ord函数判断一个字符的ASCII 码如果大于127那它应该是汉字的第一字节这样连取两字节抛弃就行了

有没有更快更好的解决办法呢?