
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.
No.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;
No.2
- 回答日時:
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 …
No.1
- 回答日時:
use Jcode;
$str="シフトJIS文字列";
&Jcode::convert(\$str, 'utf-8');
printf("%s\n", $str);
ありがとうございます。下記のようにするとできました。
できれば、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;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perl cgiの文字化けを直したい ...
-
Windowsで複数のファイルを同じ...
-
FindFirstFileとFindNextFileで...
-
DOSコマンドで、標準出力を出力...
-
パスから最後のディレクトリだ...
-
drtファイルはどうしたら開...
-
Perl 時間同士の差
-
C++でのテキストファイル読み込...
-
空白文字 \\f と\\v の違いに...
-
テキストファイルから日本語部...
-
C言語で特定の行を抽出する方法...
-
タブの色を変更する方法
-
chdirがうまくできない
-
awkスクリプトでダブルクォーテ...
-
エラーログ「\\x8ew\\x92\\xe8...
-
JavaでCSVファイルを高速に読む...
-
並び方、
-
Perl Vlookupみたいに
-
csvファイルの横方向への改行に...
-
大量メールの任意のヘッダだけ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perl cgiの文字化けを直したい ...
-
【エラー】Unrecognized character
-
does not map to shiftjis は解...
-
perlでuse utf8でsjisのファイ...
-
Data::Dumper;でダンプ後表示し...
-
消費税の計算で 税込価格から...
-
Perl UTF8で出力
-
ファイル出力をUTF8Nではなくて...
-
Perl:Unicodeプロパティ作れない
-
文字を一文字ずつ区切りたい
-
perlのmysqlで文字化けをする、...
-
sedの動作
-
perlのLWP::Simpleでgrepの値が...
-
Perl utf8上でshiftjisをデコード
-
ExcelをCSV書き出す場合のシー...
-
エクセルVBA コードが同じでも...
-
awkスクリプトでダブルクォーテ...
-
batファイルでrenameができませ...
-
VBAでCSVファイルを途中行まで...
-
Windowsで複数のファイルを同じ...
おすすめ情報