以下脚本以UTF-8编码:
use utf8;
$fuer = pack('H*', '66c3bc72');
$fuer =~ s/ü/!!!/;
print $fuer;
ü
中的s///
作为c3 bc
存储在脚本中,如以下xxd
十六进制转储所示。0000000: 75 73 65 20 75 74 66 38 3b 0a 0a 24 66 75 65 72 use utf8;..$fuer
0000010: 20 3d 20 70 61 63 6b 28 27 48 2a 27 2c 20 27 36 = pack('H*', '6
0000020: 36 63 33 62 63 37 32 27 29 3b 0a 0a 24 66 75 65 6c3bc72');..$fue
0000030: 72 20 3d 7e 20 73 2f c3 bc 2f 21 21 21 2f 3b 0a r =~ s/../!!!/;.
0000040: 0a 70 72 69 6e 74 20 24 66 75 65 72 3b 0a .print $fuer;.
c3 bc
是ü
的UTF-8表示形式。由于脚本是使用UTF-8编码的,并且我正在
use
编写utf8
,所以我希望脚本替换变量für
中的$fuer
-但事实并非如此。但是,如果我删除
use utf8
,它确实会。这与我认为use utf8
的目的背道而驰:表明该脚本以UTF-8编码。 最佳答案
问题在于角色边界。您正在将字节的编码字符串与解码的字符串进行比较$fuer = pack('H*', '66c3bc72')
创建四个字节的字符串"\x66\xc3\xbc\x72"
,而带有小写字母ü
的小u是"\xfc"
,因此两者不匹配
如果使用decode_utf8
模块中的Encode
进一步处理变量$fuer
,它将对UTF-8进行解码以形成三个字符的字符串"\x66\xfc\x72"
,然后替换项将起作用use utf8
将等价于decode_utf8
的内容应用于整个源文件,因此如果没有它,您的ü
会显示为"\xc3\xbc"
编码,与打包的变量匹配