これからの季節に親子でハイキング! >>

perlをwindows環境でshift-jisのテキストファイルを読み込み、読み込んだファイルをutf-8でファイルを書き込み(改行コードはLF)をする方法がわかりません。
サンプルプログラムを示してもらえると助かります。


書き込みを”binmode STDOUT, ":utf8";”にするだけでは、下記のようなエラーがでました。エラーの意味が良くわかりませんでした。わかれば教えてください。

Malformed UTF-8 character (unexpected continuation byte 0x82, with no preceding
start byte) at utf.pl line 7.

このQ&Aに関連する最新のQ&A

A 回答 (3件)

質問文に「binmode STDOUT, ":utf8";」と書いておられるので、リダイレクトを使用するのかなと想像しました。



<utf.pl>
use open IN => ":encoding(cp932)";
binmode STDOUT, ":raw:utf8";

print <>;

コマンドラインから以下のように打てば所望の結果が得られるのではと思います。

C:\>perl utf.pl sjis.txt >utf8.txt

>No.2さんへ
open時に、:rawを入れればbinmodeを省略できると思います。

open my $in, "<:encoding(cp932)", "sjis.txt";
open my $out, ">:raw:utf8", "utf8.txt";

print {$out} <$in>;

close $in
close $out;
    • good
    • 0
この回答へのお礼

参考になりました。
ありがとうございます。

お礼日時:2010/05/24 08:24

open でエンコードを指定すれば良いかと。



------------------------------------------------------
use Encode;

open(IN, "<:encoding(sjis)", "sjis.txt") or die "Can't open sjis.txt.";
open(OUT, ">:utf8", "utf8.txt") or die "Can't open utf8.txt.";
binmode(OUT); # 改行をLFのみにする為

while (my $line = <IN>) {
print OUT encode('utf8', $line); # encode は utf8 フラグを外すため
}

close(OUT);
close(IN);
------------------------------------------------------

print OUT encode('utf8', $line);

print OUT $line;
としても動作しますが、警告が出ます。

改行コードの変更がなければ、binmode(OUT) も encode('utf8', ・・・) も要らないのですが・・・。

> Malformed UTF-8 character ・・・

スクリプト内にUTF-8として正しくない文字が有るというエラーです。
「use utf8;」を宣言しているにもかかわらず、UTF-8以外の文字コード(Shift_JIS等)でスクリプト自体が記述されている場合などに出ます。

スクリプト自体はUTF-8で書くのが無難です。

参考URL:http://www.rwds.net/kuroita/program/Perl_unicode …
    • good
    • 0

use Jcode;


$str="シフトJIS文字列";
&Jcode::convert(\$str, 'utf-8');
printf("%s\n", $str);
    • good
    • 0
この回答へのお礼

ありがとうございます。下記のようにするとできました。
できれば、Jcodeは速度が遅いイメージを持っているので使用したくないので、別の方法を教えていただければと思います。

use Jcode;
$str="シフトJIS文字列";
&Jcode::convert(\$str, 'utf-8');
my $file = "temp.txt";
open $fh, '>', $file or die "Cannot open '$file': $!";
binmode $fh;
print $fh $str."\n";
print $fh $str."\n";
close $fh;

お礼日時:2010/05/16 21:41

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QMalformed UTF-8 character

あるWebシステムで、エラーログに「Malformed UTF-8 character」が大量に出力されています。

意味はわかるのですが、どんな文字列がエラーになっているか分からないので、デバッグできず困っています。

# 全てのアクセスで必ず通るロジックなので、入力文字列を無条件にダンプするわけにも行きません。

もし、「Malformed UTF-8 character」になる見込みの文字列だけダンプするなど、効率的なデバッグ手段があれば、教えていただけますでしょうか。

よろしくお願いいたします。

Aベストアンサー

Malformed UTF-8 character というメッセージは、いわゆる「フラグ付き内部文字列 (UTF-8)」への変換が適切に行われていないことを示しています。元の文字列の文字コードの指定誤りが、主な原因となります。メッセージの末尾には「ファイル名と行番号」が示されているはずですので、それを手がかりに調べていけばよいと思います。


人気Q&Aランキング