プロが教える店舗&オフィスのセキュリティ対策術

こんにちは、お力を貸して下さい。

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
新しい解決法がありましたら、よろしくお願いします。

A 回答 (2件)

手元の環境 (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 してみたら、原因がある程度解明できるかもしれません。

そうした場合のデータを開示していただけますか。
    • good
    • 0
この回答へのお礼

お力、ありがとうございます!

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 にはなってるんですかね…

お礼日時:2003/04/28 11:49

おおざっぱに言えば、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.h …
    • good
    • 0
この回答へのお礼

お力、ありがとうございます!

そうなんですよね、どうして濁点を1文字にしてしまったのか…

私も調べて見たのですが、Ruby というのはオブジェクト指向言語なんですね。このRuby がPerl 内で動くのであれば、初めて聞く名前なのでいろいろ調べてからやってみたいと思います。

やはり、s 置換方法の方がいまのところの解決策なんでしょうね~;;

お礼日時:2003/04/28 12:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!