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";
# => 1
UTF8 フラグあれこれ - 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は未確認。