Re: [问题] 字串经过encode之后的length

楼主: cutekid (可爱小孩子)   2018-11-17 15:06:00
$str1 = "中文"; # UTF-8 Encoding
中: 0xE4 0xB8 0xAD (UTF-8 Encoding)
文: 0xE6 0x96 0x87 (UTF-8 Encoding)
encode("UTF-8", $str1)时,$str1 被当作 Latin-1 在看(因为这时 UTF-8 flag = off)
所以就变成 "\x{e4}\x{b8}\x{ad}\x{e6}\x{96}\x{87}" 共 6 个 Latin-1 字符转 UTF-8
总共 12 个 Bytes: 0xC3 0xA4 0xC2 0xB8 0xC2 0xAD 0xC3 0xA6 0xC2 0x96 0xC2 0x87
结论:
1. 纯英文的时候,Latin-1 和 UTF-8 编码相同(都占 1 个 Byte),所以 Byte 数不会变
2. 有中文的时候,一个字占 3 个 Bytes(UTF-8),被当作 Latin-1 看就变成 3 个字符
Latin-1 大于 0x7F 的字符,转成 UTF-8 占 2 个 Bytes
所以就可以解释: 为什么 length of encode("UTF-8", "ABC呢") = 9 (3 + 3 x 2)
※ 引述《kipi91718 (Renewal Process)》之铭言:
: 各位大大好,初次在本版发文,请多指教。
: 在perldoc上面有叙述到:
: When you run $octets = encode("utf8", $string) , then $octets might not be
: equal to $string. Though both contain the same data, the UTF8 flag for
: $octets is always off. When you encode anything, the UTF8 flag on the result
: is always off, even when it contains a completely valid utf8 string.
: https://perldoc.perl.org/Encode.html
: 我测试了以下三个状况,在perl 5.26.1的环境下确认原始字串都是utf-8,
: 但在encode之后用length去检测发现结果不太能完全理解。
: 1. $str1 = "中文";
: length( $str1 ); #答案为6,因为UTF8 flag off,这是在算byte数,中文占3 Bytes
:
: Encode::_utf8_on( $str1 );
: length( $str1 ); #答案为2,因为UTF8 flag on,这是在算中文字数量
:
: Encode::_utf8_off( $str1 );
: length( $str1 ); #答案为为6,一样是UTF8 flag off的状况,为byte数
:
: $str1_e = encode("UTF-8", str1);
: length($str1_e); #答案为12,不知道是在计算什么的数量才会得到12
:
: 2. $str2 = "English";
: length( $str2 ); #因为英文本来就只占了1 Byte,所以答案为7
:
: Encode::_utf8_on( $str2 );
: length( $str2 ); #算字数一样答案为7
:
: Encode::_utf8_off( $str2 );
: length( $str2 ); #7 Bytes
:
: $str2_e = encode("UTF-8", str2);
: length( $str2); #没改变,一样是7,是什么原因呢?
: 3. $str3 = "ABC呢";
: length( $str3 ); #英文 1*3 = 3 Bytes + 中文 3*1 = 3 Bytes 答案为6 Bytes
:
: Encode::_utf8_on( $str3 );
: length( $str3 ); #共3英文字+1中文字 = 4个字
:
: Encode::_utf8_off( $str3 );
: length( $str3 ); #6,因为6 Bytes
:
: $str3_e = encode("UTF-8", str3);
: length( $str3_e); #答案为9,所以看起来中文在这情况下的结果是每字+6?
:
: 经过以上实测,比较有疑问的是encode到底做了什么? 以至于让length去侦测时,中文
: 会回传6呢?
: 又问得更根本,在encode回来之后$octets送进length时,
: 究竟是被当作什么型态在处理呢?
: 请版上专业的大大解惑,我可以200P作为微薄的谢礼,谢谢!
作者: kipi91718 (正港台湾人)   2018-11-17 21:34:00
感谢 红包已发

Links booklink

Contact Us: admin [ a t ] ucptt.com