utf8文字列とファイル名、の続き
utf8文字列とファイル名、の続き
こと Latin-1 の範囲(U+0000 ~ U+00FF)に収まる Character で構成される文字列に限っていえば,同じ文字列を内部 Latin-1 でも 内部 UTF-8 でも表象できます。
このとき,eq オペレータで比較すると,(内部表象はどうであれ)等価な文字列かどうかを比較することができます。
#!/usr/bin/perl use strict; use warnings; my $str1 = "H\x{e9}llo"; my $str2 = $str1; utf8::upgrade($str2); # Now, $str1 is internally represented in Latin-1 encoding # $str2 is internally represented in UTF-8 encoding # $str1: {utf8=0}[H][\xe9] [e][l][l][o] # $str2: {utf8=1}[H][\xc3,\xa9][e][l][l][o] # 内的エンコーディングが違うだけで両者の意味するものは同じ print $str1 eq $str2 ? 1:0, "\n"; # => 1UTF8 フラグあれこれ - Unicode 文字列の透過性 (1)
これは知らなかった。
ということは、
#!/usr/bin/perl use strict; use warnings; my $str1 = "H\x{e9}llo"; my $str2 = $str1; utf8::upgrade($str2); sub append_file { my $filename = shift; open my $fh, '>>', $filename; print $fh "$filename\n"; } append_file( $latin1 ); append_file( $utf8 );
――とすればファイルが1つだけ作られるのかな? と思って実行してみたら、ファイルが複数に*1。
うーむ。過去のテストからすると妥当ではあるんだけど。
やっぱりutf8フラグ付きの文字列でファイル名に関する操作するときはwarning等を出すべきじゃないのかなぁ、とか思った。
(printする時にlatin-1の範囲だとwarning出さないみたいだし。これでハマる事ってないんじゃろか)
*1:Perl5.8.6にて確認。5.10は未確認。