日本語のファイル名を英語のファイル名に置き換える perl スクリプトをまとめました。しかし、まだよく理解していないことがいくつかあります。
次の構成の クライアント OSがあります。
Windows XP 日本
メモ帳++、インストール済み
サーバ:
Red Hat Enterprise Linux サーバー リリース 6.2
Perl v5.10.1
VIM : VIM バージョン 7.2.411
Xterm : ASTEC-X バージョン 6.0
CSH: tcsh 6.17.00 (アストロン)
ファイルのソースは、Windows で生成された日本語の .csv ファイルです。Perl での utf8 とエンコーディング変換の使用に関する投稿を見ましたが、他のスレッドで何も言及する必要がなかった理由をよりよく理解したいと思っています。
これが機能した私のスクリプトですか?私の質問は以下です。
#!/usr/bin/perl
my $work_dir = "/nas1_home4/fsomeguy/someplace";
opendir(DIR, $work_dir) or die "Cannot open directory";
my @files = readdir(DIR);
foreach (@files)
{
my $original_file = $_;
s/機/–machine_/; # replace 機 with -machine_
my $new_file = $_;
if ($new_file ne $original_file)
{
print "Rename " . $original_file . " to " . $new_file;
rename("${work_dir}/${original_file}", "${work_dir}/${new_file}") or print "Warning: rename failed because: $!\n";
}
}
質問:
1) このサンプルで utf8 が必要ないのはなぜですか? どのような例でそれが必要になるでしょうか。uft8を使用してください。議論されました: utf8 を使用すると、「ワイド文字が表示されます」 )? しかし、use utf8 を追加した場合、このスクリプトは機能しません。
2) このサンプルでエンコード操作が必要ないのはなぜですか?
私は実際にWindowsでNotepad ++を使用してスクリプトを作成しました(Windows XP Japanのエクスプローラーからスクリプトに日本語の文字を貼り付けました)。Xterm と VIM では、文字がガベージ文字として表示されます。しかし、ここで説明されているエンコーディング操作も処理する必要はありませんでした。 Perl で日本語の文字をユニコードに変換するにはどうすればよいですか? .
ありがとう。
アップデート 1
日本語でのファイル名とファイル テキストの置換について、Perl で簡単なローカライズ サンプルをテストする
Windows XP では、.csv データ ファイル内から南の文字をコピーしてクリップボードにコピーし、それをファイル名 (つまり、南.txt) とファイル コンテンツ (南) の両方として使用します。Notepad++ では、エンコード UTF-8 でファイルを読み取ると x93xEC が表示され、SHIFT_JIS で読み取ると南が表示されます。
脚本:
次の Perl スクリプト south.pl を使用します。これは、Perl 5.10 を搭載した Linux サーバーで実行されます。
#!/usr/bin/perl
use feature qw(say);
use strict;
use warnings;
use utf8;
use Encode qw(decode encode);
my $user_dir="/usr/frank";
my $work_dir = "${user_dir}/test_south";
# forward declare the function prototypes
sub fileProcess;
opendir(DIR, ${work_dir}) or die "Cannot open directory " . ${work_dir};
# readdir OPTION 1 - shift_jis
#my @files = map { Encode::decode("shift_jis", $_); } readdir DIR; # Note filename could not be decoded as shift_jis
#binmode(STDOUT,":encoding(shift_jis)");
# readdir OPTION 2 - utf8
my @files = map { Encode::decode("utf8", $_); } readdir DIR; # Note filename could be decoded as utf8
binmode(STDOUT,":encoding(utf8)"); # setting display to output utf8
say @files;
# pass an array reference of files that will be modified
fileNameTranslate();
fileProcess();
closedir(DIR);
exit;
sub fileNameTranslate
{
foreach (@files)
{
my $original_file = $_;
#print "original_file: " . "$original_file" . "\n";
s/南/south/;
my $new_file = $_;
# print "new_file: " . "$_" . "\n";
if ($new_file ne $original_file)
{
print "Rename " . $original_file . " to \n\t" . $new_file . "\n";
rename("${work_dir}/${original_file}", "${work_dir}/${new_file}") or print "Warning: rename failed because: $!\n";
}
}
}
sub fileProcess
{
# file process OPTION 3, open file as shift_jis, the search and replace would work
# open (IN1, "<:encoding(shift_jis)", "${work_dir}/south.txt") or die "Error: south.txt\n";
# open (OUT1, "+>:encoding(shift_jis)" , "${work_dir}/south1.txt") or die "Error: south1.txt\n";
# file process OPTION 4, open file as utf8, the search and replace would not work
open (IN1, "<:encoding(utf8)", "${work_dir}/south.txt") or die "Error: south.txt\n";
open (OUT1, "+>:encoding(utf8)" , "${work_dir}/south1.txt") or die "Error: south1.txt\n";
while (<IN1>)
{
print $_ . "\n";
chomp;
s/南/south/g;
print OUT1 "$_\n";
}
close IN1;
close OUT1;
}
結果:
(BAD) オプション 1 と 3 のコメントを外します (オプション 2 と 4 のコメント) セットアップ: Readdir エンコーディング、SHIFT_JIS; file open encoding SHIFT_JIS 結果: ファイル名の置換に失敗しました.. エラー: utf8 "\x93" は .//south.pl 行 68 で Unicode にマップされません。\x93
(悪い) オプション 2 と 4 のコメントを外します (オプション 1 と 3 のコメント) セットアップ: Readdir エンコーディング、utf8; file open encoding utf8 結果: ファイル名の置換が機能し、south.txt が生成されましたが、south1.txt ファイルの内容の置換に失敗しました。内容は \x93 () です。エラー: "\x{fffd}" は .//south.pl 行 25 の shiftjis にマップされません。 ... -Ao?= (Bx{fffd}.txt
(GOOD) オプション 2 と 3 のコメントを外します。(オプション 1 と 4 のコメントを付けます) セットアップ: Readdir エンコーディング、utf8; file open encoding SHIFT_JIS 結果: ファイル名の置換が機能し、south.txt が生成されました South1.txt ファイルのコンテンツの置換が機能し、コンテンツは south になりました。
結論:
この例を正しく動作させるには、別のエンコード スキームを使用する必要がありました。readdir utf8、および csv ファイルの内容が SHIFT_JIS エンコードされているため、ファイル処理 SHIFT_JIS。