dポイントプレゼントキャンペーン実施中!

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.

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が見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A