プロが教えるわが家の防犯対策術!

Perlをいじって2日の者です。
WindowsVistaを使っております。

現在renameを使ってファイル名を変更しようとしています。

現在のファイル名がIDだけで、
Web上にあるそのIDに対応する情報をファイル名に追加しようとしています。

Web上の情報を取得するまではできたのですが、
変数に入れたその情報を、ファイル名に入れようとすると文字化けします。
ただ、その情報をコマンドプロントで扱う時も、テキストへ出力してみても文字化けしません。

文字化けは、文字コードなるものが原因らしいということで、
とりあえずよく見かける「UTF-8」というものにエンコードしてみたところ、
テキストへの出力が、ファイル名へのそれと同様に文字化けしました。

エンコードした上でファイル名に入れようとすると
情報のそのものがないものとして扱われるようになりました。

これはどう解釈すればいいのでしょうか?
どうすれば文字化けを解決できるでしょうか?

A 回答 (2件)

UTF8フラグを外せばよいです。



Windows XP では 下のスクリプトをUTF8 で保存し、実行すると文字化けしないで「かきくけこ.txt」が作成されます。文字コードにCP932を指定していますが、SJISとほぼ同じです。

Vista でも同じではないでしょうか。

use strict;
use warnings;
use Encode;
use utf8;

my $file_name="あいうえお.txt";
open my $out, ">", Encode::encode('CP932', $file_name) or die;
print $out Encode::encode('CP932', "こんにちは\n");
close $out;

my $new_name = "かきくけこ.txt";
rename Encode::encode('CP932', $file_name), Encode::encode('CP932', $new_name);

exit;
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

色々調べてる内にUTF8フラグという言葉は出てきたのですがよくわからずじまいにしていました。
今でも今ひとつ分かっていませんが
>rename Encode::encode('CP932', $file_name), Encode::encode('CP932', $new_name);
の部分をマネてみたところとりあえず文字化けは克服できました!

とりあえず処理だけ済ましてまて勉強しようとおもいます。
ありがとうございました。

お礼日時:2012/03/17 19:33

windows側がUTF-8じゃないっていうオチじゃないかな。


文字コードっていうのは 文字の表示についての「地方語」みたいなものだと思えば良いよ。

つまり windowsのファイルシステムが返してくる文字コードとperlが駆動している文字コードを一致させるう必要が有るってこと。

文字コード変換関連で調べれば出てくるんじゃないかな。
    • good
    • 0
この回答へのお礼

迅速な回答ありがとうございます!

>つまり windowsのファイルシステムが返してくる文字コードとperlが駆動している文字コードを一致させるう必要が有るってこと。

これはなんとなくわかります。
今、基本的にエンコード無しだとshift-jisで出力されているようです。
(shift-jisにエンコードした時と出力結果が同じなため)
テキストへの出力だとこれで問題ないようです。

ただ、ファイル名に同じ情報を持っていても文字化けしてしまうので、
ファイル名だと別の文字コードが使用されているのではないかと考えています。

『windows ファイル名 文字コード』等で検索して
目についた文字コードに片っ端からエンコードしてみましたがダメでした。
(utf-8,utf-16,unicode,euc-jp,sjis)

他に何かあるでしょうか?

お礼日時:2012/03/17 13:23

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