Hatena::Groupasakura

浅倉卓司@blog風味? このページをアンテナに追加 RSSフィード

Error : RSSが取得できませんでした。

2008-02-25(Mon)

utf8文字列とファイル名、の続き

| 13:41 |  utf8文字列とファイル名、の続き - 浅倉卓司@blog風味? を含むブックマーク  utf8文字列とファイル名、の続き - 浅倉卓司@blog風味? のブックマークコメント

こと 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は未確認。

トラックバック - http://asakura.g.hatena.ne.jp/asakura-t/20080225
2004 | 01 | 02 | 03 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 08 | 09 | 10 | 11 | 12 |
2007 | 02 | 03 | 04 | 05 | 06 | 07 | 10 | 11 | 12 |
2008 | 02 | 03 | 04 | 06 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 02 | 03 | 04 | 05 | 07 | 08 | 10 | 11 | 12 |
2013 | 01 | 05 | 07 |
2014 | 01 | 02 |
2016 | 01 |
2017 | 01 | 05 |