ここから質問投稿すると、最大4000ポイント当たる!!!! >>

Perl5.8でCSVをダウンロードできる仕組みをつくっています。
utf-8でコードを記述しているため当然ながらダウンロードしたCSVデータもutf-8です。
しかしながらエクセルでダブルクリックで開く場合どうしてもutf-8だと支障があるため、
shift-jis(もしくはcp932)で開きたいのです。
ダウンロード時に文字とファイルをshift_jisに変換する方法はございませんでしょうか?

以下作成済みのコード
-------------------------------------------------------
if(!open(OUT,"$CSV_FILE")){&error('CSVデーターファイルがありません'); }
else{
@csvdata=<OUT>;
close(OUT);
}

foreach(@csvdata){

$downloaddata .= $_;

}
print "Content-Disposition: attachment; filename=$CSV_FILE_NAME\n\n";
print $downloaddata;
exit;
-------------------------------------------------------

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

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

A 回答 (1件)

--------------


foreach(@csvdata){
use Encode; # この行と
Encode::from_to( $_, 'utf8', 'shiftjis' ); # この行を挿入
$downloaddata .= $_;
}
--------------
上記のように2行挿入してみてください。
PerlのバージョンによってはEncodeモジュールが入ってない場合はエラーになります。
お試しください。

参考URL:http://oshiete.goo.ne.jp/qa/7584615.html
    • good
    • 0
この回答へのお礼

さっそく施してみました。

ばっちりできました!

助かりました。

ありがとうございました。

お礼日時:2013/04/03 22:27

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

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

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

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

Q[Perl]ファイル出力のエンコード(EUC、SJIS、UTF8)を指定したい

EUCで書かれた文章を読み取ったにもかかわらず、S-JISで出力されます。
これを、任意の文字コードに指定して、出力する方法は無いものでしょうか?
ご存知の方、教えてください。
宜しくお願い致します。

Aベストアンサー

以下のサンプルは、コードをUTF-8 で記述して、標準出力をシフトJISで出力し、EUC-JPでファイルから入力します。
"<:encoding(euc-jp)" は、PerlIO レイヤの指定で、これを変えれば、ファイル出力を任意の文字コードにできます。
binmode STDOUT, ":encoding(euc-jp)";
のような指定もできます。
----------------------------------------------------------------
use encoding "UTF-8", STDOUT => "Shift_JIS";

open(FH, "<:encoding(euc-jp)", "EUC.txt");
while(<FH>){
print ;
}
close(FH);

Q文字コードの変換(Shift-JISからUTF8)

文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに
プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを
確認するとShift-JISのままです。
どなたか教えていただけないでしょうか?
ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。

#!/usr/bin/perl

use strict;
use warnings;

use utf8;
use Encode;

my $input_file="input.csv";
my $output_file="output.txt";
open (IN, $input_file) or die "$!";
open (OUT, ">$output_file") or die "$!";

while (<IN>){
chomp ($_);
my @data=split(/,/,$_);

for(my $i=0;$i<@data;$i++){
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換
$data[$i]=~s/\s+//g;
print OUT $_;
}
print OUT "\n";
}
close (IN);
close (OUT);

文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに
プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを
確認するとShift-JISのままです。
どなたか教えていただけないでしょうか?
ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。

#!/usr/bin/perl

use strict;
use warnings;

use utf8;
use Encode;

my $input_file="input.csv";
my $output_file="output.txt";
open (IN, $input_file) or die "$!...続きを読む

Aベストアンサー

あの、私のや他の回答をよく読んで考えてください。


for(my $i=0;$i<@data;$i++){
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換
$data[$i]=~s/\s+//g;
print OUT $_;
}

この部分は **** $_には何の影響も与えません ****
よって、** 出力に関することだけに注目したら **

for(my $i=0;$i<@data;$i++){
print OUT $_;
}

これと等価です。どこで「Shift_JIS からUTF-8へ変換」してますか?
$_は「while (<IN>){」の<IN>で1行読み込まれ、「chomp ($_);」で末尾の改行コードが削除されただけで、移行なにも変化していません。コードは入力のまま=Shift_JISです。それをそのまま出力すればShift_JISになるのが正解です。
しかも、項目数分だけ繰り返し出力されます。
(重複行になる、と#1に書いたのはchompのことを失念していた私のミスです)

@dataを変更したのなら、出力するのは@dataでしょう。
join(",", @data)とすれば、項目をカンマ区切りの文字列にすることができます。


あと#2にあったfrom_toの使い方。マニュアルをよく読みましょう
http://perldoc.perl.org/Encode.html#[$length-=]-from_to($octets,-FROM_ENC,-TO_ENC-[,-CHECK])
・$octetsを直接変換する
・$octetsの長さを返す
とあります。つまり
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8')
だと,$data[$i]には元の内容は破棄されて、文字列の長さになってしまいます。



各項目毎に処理したい、という意図はわかりました。

ですが、文字コードの変換が項目毎に違うなんてことはまず無いでしょう。
それならば、$_で1行をコード変換→splitして項目毎の処理、としてもいいのでは?

ついでにPerlIOを使って
open (IN, "<:encoding(shift_jis)", $input_file) or die "$!";
open (OUT, ">:utf8", $output_file) or die "$!";
とでもやれば、プログラム中はコードをあまり意識せずに文字列処理ができます。

あの、私のや他の回答をよく読んで考えてください。


for(my $i=0;$i<@data;$i++){
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換
$data[$i]=~s/\s+//g;
print OUT $_;
}

この部分は **** $_には何の影響も与えません ****
よって、** 出力に関することだけに注目したら **

for(my $i=0;$i<@data;$i++){
print OUT $_;
}

これと等価です。どこで「Shift_JIS からUTF-8へ変換」してますか?
$_は「while (<IN>){」の<IN>で1行読み込まれ、「chomp ($_);」で末尾の改行コ...続きを読む

QPerl UTF8で出力

Perlで
Shift-JIS形式のファイルを読み込み、その内容をUTF8形式のHTMLファイルに保存する場合どのように処理したら良いのでしょうか?
下記のような処理だと文字化けしてしまいます。

---Shift-JISのファイルを読み込む
open(IN,"$file");
@list = (<IN>);
close(IN);

---内容を$htmlにセットして
---UTF8形式で書き出したい
open(OUT,">$file");
print OUT $html;
close(OUT);

Aベストアンサー

文字化けの原因を調査しましょう。

・元のファイルは本当にShift_JISなのか
・出力されたファイルは本当にUTF-8なのか
 →出力はUTF-8になっているが、ブラウザがUTF-8にならない
・「---内容を$htmlにセットして」の箇所に問題がある

ありがちなのが
・元のファイルに charset=shift_jis 等の記述がある
→出力にもそのまま残っている
というものです。そういうことは無いですか?


人気Q&Aランキング