背景:
私は 2 台のマシンを持っています。1 台はドイツ語の Windows 7 を実行しており、私の PC は英語 (ヘブライ語ロケールを使用) の Windows 7 を実行しています。
私の Perl コードでは、ドイツ語のマシンから取得したファイルが自分のマシンに存在するかどうかを確認しようとしています。
ファイル名は ßßßzllpoöäüljiznppü.txt です。
次のコードを実行すると失敗するのはなぜですか。
use Encode;
use Encode::locale;
sub UTF8ToLocale
{
my $str = decode("utf8",$_[0]);
return encode(locale, $str);
}
if(!-e UTF8ToLocale($read_file))
{
print "failed to open the file";
}
else
{
print $read_file;
}
ファイルを開こうとしているときにも同じことが起こります:
open (wtFile, ">", UTF8ToLocale($read_file));
binmode wtFile;
shift @_;
print wtFile @_;
close wtFile;
ファイル名は、Java アプリケーションでドイツ語から utf8 に変換され、これが perl スクリプトに渡されます。perl スクリプトはこのファイル名を取得し、utf8 からシステム ロケールに変換します。UTF8ToLocale($read_file) 関数呼び出しを参照してください。これが問題だと思います。
質問:
OS ファイル システムの文字セットのエンコーディングを教えてください。
ロケールがヘブライ語の OS でドイツ語のファイル名を作成すると、どの文字セットで保存されますか?
この問題を解決するにはどうすればよいですか?
アップデート:
PC でハードコードされたファイル名を使用して実行した別のコードを次に示します。スクリプト ファイルは utf8 でエンコードされています。
use Encode;
use Encode::locale;
my $string = encode("utf-16",decode("utf8","C:\\TestPerl\\ßßßzllpoöäüljiznppü.txt"));
if (-e $string)
{
print "exists\r\n";
}
else
{
print "not exists\r\n"
}
出力は「存在しません」です。また、さまざまな文字セットを試しました: cp1252、cp850、utf-16le、何も機能しません。ファイル名を英語またはヘブライ語 (デフォルトのロケール) に変更すると、機能します。何か案は?