出産前後の痔にはご注意!

日本語処理、ActivePerlでは無理なのでしょうか?

下記test.plを実行すると、
========================================================
"\x{00e3}" does not map to shiftjis at test.pl line 10.
...
u is \x{00e3}\x{0082}\x ...
"\x{0082}" does not map to shiftjis at test.pl line 11.
...
s is \x{0082}\x{00e6}\x{0081}[\x{0082}±
me is 倉田真由美
=========================================================
となって、倉田真由美しか期待通りに出力されません。
外部ファイルの"よーこ"を正しく扱う方法はないのでしょうか?


test.pl (utf-8)
--------------------------------------------
use utf8;
binmode STDOUT => ":encoding(shiftjis)";
binmode STDERR => ":encoding(shiftjis)";

require 'u.pl'; # utf-8 の外部スクリプト
require 's.pl'; # sjisの外部スクリプト

$me = "倉田真由美";

print "u is $u\n";
print "s is $s\n";
print "me is $me\n";
-------------------------------------------


u.pl (utf-8)
-------------------------------------------
$u = "よーこ";
-------------------------------------------


s.pl (sjis)
-------------------------------------------
$s = "よーこ";
-------------------------------------------

ActivePerl 5.8.0.806
Windows2000 (cmd.exe)


よろしくお願い申し上げます。

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

A 回答 (2件)

ウチで使っているのは


ActivePerl v5.8.4
build 810

環境は
XPProです
#1の答えの様にして、期待通り動きました。

最新バージョンに変えてみてはどうでしょうか
    • good
    • 0
この回答へのお礼

完璧です!
5.8.6にバージョンアップしたら、みごと解決できました!
ありがとうございます!!

同一人に20pt+10ptはできないみたいで20だけさせていただきました。

お礼日時:2004/12/22 13:05

読み込みするスクリプトファイルの方で、エンコードを記入しておく。



u.pl (utf-8)
-------------------------------------------
use encoding utf8;
$u = "よーこ";
-------------------------------------------

s.pl (sjis)
-------------------------------------------
use encoding sjis;
$s = "よーこ";
-------------------------------------------
    • good
    • 0
この回答へのお礼

ありがとうございます。
でも解決できませんね。
use utf8;
use shiftjis;
等も試しましたが、シフトJISの方だけdoes not mapが吐かれなくなりました。

しかし、出力は
s is \x{00a6}\x{005b}\x{00b1}

s is よーこ
u is よーこ
と出したいのです。

こちらの環境が悪いのでしょうか?

かなり基本的なことだと思うのですが、方々調べても解決策はありませんでした(2日も使ってしまいました)。
「Perlには無理」とエキスパートの方からはっきり言って頂けるとあきらめもつくのですが。

お礼日時:2004/12/22 11:00

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

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

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

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でuse utf8でsjisのファイルを読んで出力すると誤表示する。

下記のソースで誤表示しない方法を知りたい。
1 use utf8
2 use Encode;
3 use open IO => ":encoding(sjis)";
4 binmode STDOUT,':utf8';
5 open (IN,'03.txt')||die "file ope err\n";
6 @in=<IN>;
7 close IN;
8 @in=();
9 print @in;

下記のエラーが出る。
shiftjis "\x87" does not map to Unicode at C:\Users\usui\EDMax\DataGen6\03.pl line 6, <IN> line 2175.

Aベストアンサー

丁度いいのがあったので。
http://charset.7jp.net/sjis.html

\x87 ということは、この表の「シフトJISの2バイトコード(全角文字)のエリアマップ」の「13/14 87」というところに並んでいる ①みたいな数字とか 一文字で表した ローマ数字 ( I , II , III 等) を使っていませんか?

これらの文字は「Shift_JIS」には無い文字です。
よって、Unicodeに変換できません。

Shift_JISを拡張した CP932 などには、これらの文字が含まれています。
https://ja.wikipedia.org/wiki/Microsoft%E3%82%B3%E3%83%BC%E3%83%89%E3%83%9A%E3%83%BC%E3%82%B8932

sjisではなく、cp932で試してみてはいかがでしょうか


人気Q&Aランキング