• ベストアンサー

PerlでUTF8をEUCに変換

こんにちは、お力を貸して下さい。 OSX上で日本語のファイル名を取得し そのファイル名をeucに変換しようとすると 半濁音付きのカナが文字化けを起こしてしまうのです。 Web上で “$euc = Jcode($euc, 'utf8')->z2h->h2z->euc;” で、できないこともないみたいだったので、さっそくやってみたんですが… 変換したいファイル名は、「1ドキュメント」とします。 -------------------------------------- #!/usr/bin/perl use strict; use Jcode; my $path = "パスがはいっている"; my @files; opendir DIR, $path; @files = grep /^1/ && -f "$path/$_", readdir(DIR); closedir DIR; foreach (@files) { my $euc = $_; $euc = Jcode->new($euc, 'utf8')->z2h->h2z->euc; print "$euc\n"; } exit; -------------------------------------- 結果:1ト〓キュメント やっぱり文字化けしましたTT 新しい解決法がありましたら、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

おおざっぱに言えば、Mac OS Xのファイル名の扱いでは、濁点が1文字として扱われてます。 正確なところは、Apple TILをご覧下さい。 macosx-jp MLで、これに対応したモジュールが話題にのぼってたのですが、ソースを置いてあるというURLは切れてました。googleで検索かけたら、rubyでも同様なモジュールあるみたいです。 w3m-m17だとちゃんと変換してくれるみたいなので、これをフィルタにするという手も。 手っ取り早くやろうと思ったら、Jcode.pmを派生させて、eucに変換したあと、s/ト〓/ド/gってのを化けそうな文字分列挙して無理矢理直しちゃうメソッドを定義しちゃうとか。

参考URL:
http://developer.apple.com/ja/qa/qa2001/qa1173.html
noname#96662
質問者

お礼

お力、ありがとうございます! そうなんですよね、どうして濁点を1文字にしてしまったのか… 私も調べて見たのですが、Ruby というのはオブジェクト指向言語なんですね。このRuby がPerl 内で動くのであれば、初めて聞く名前なのでいろいろ調べてからやってみたいと思います。 やはり、s 置換方法の方がいまのところの解決策なんでしょうね~;;

その他の回答 (1)

  • nipotan
  • ベストアンサー率59% (134/227)
回答No.1

手元の環境 (Jcode v0.83)で同様の現象が再現しないのですが、 まず Jcode のバージョンはいくつでしょうか。 あと、データが正しいかどうかを見たいのですが、 とりあえず foreach (@files) { my $euc = $_; # 追加 print join " ", map{ sprintf '%02X', ord $_ } split //, $euc; $euc = Jcode->new($euc, 'utf8')->z2h->h2z->euc; # 追加 print join " ", map{ sprintf '%02X', ord $_ } split //, $euc; print "$euc\n"; } こうして、$euc の中身を hexdump してみたら、原因がある程度解明できるかもしれません。 そうした場合のデータを開示していただけますか。

noname#96662
質問者

お礼

お力、ありがとうございます! Jcode なんですが、Jcode.pm をインストールしています。バージョンは…2.10 になるのかな? さっそく、追加して実行してみました。 結果、変換前のコードは、  31 E3 83 88 E3 82 99 E3 82 AD E3 83 A5 E3 83 A1 E3 83 B3 E3 83 88 変換後のコードは、  31 A5 C8 A2 AE A5 AD A5 E5 A5 E1 A5 F3 A5 C8 でした。 一応、euc にはなってるんですかね…

関連するQ&A