Ren*_*ger 6 perl utf-8 character-encoding
以下脚本以UTF-8编码:
use utf8;
$fuer = pack('H*', '66c3bc72');
$fuer =~ s/ü/!!!/;
print $fuer;
Run Code Online (Sandbox Code Playgroud)
其中ü
的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;.
Run Code Online (Sandbox Code Playgroud)
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"
,与匹配变量匹配
归档时间: |
|
查看次数: |
472 次 |
最近记录: |