質問投稿でgooポイントが当たるキャンペーン実施中!!>>

下記のソースで誤表示しない方法を知りたい。
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.

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

A 回答 (1件)

丁度いいのがあったので。


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 …

sjisではなく、cp932で試してみてはいかがでしょうか
    • good
    • 0
この回答へのお礼

助かりました。
cp932で正常に動作しました。

有難う御座いました。

お礼日時:2015/07/27 23:02

この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 ($_);」で末尾の改行コ...続きを読む

Qdoes not map to shiftjis は解決不可能でしょうか?

日本語処理、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)


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

日本語処理、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 倉田真由美
=========================================================
となって、倉田真由美しか期待通りに出力されません。
外部ファイルの"よー...続きを読む

Aベストアンサー

ウチで使っているのは
ActivePerl v5.8.4
build 810

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

最新バージョンに変えてみてはどうでしょうか

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);

QUTF-8のPerlから、UTF-8、EUC、Shift-jisの3つのエンコードテキストを生成

UTF-8で作ったPerl内で、UTF-8にエンコードしたい部分とは別に、
EUCやShift-jisにエンコードして、
UTF-8以外の仕様になっている検索エンジンなどの検索結果に、
テキストリンクを飛ばしたいのですが、行き詰まりました。
いい方法はありますでしょうか。

Aベストアンサー

use utf8;
use Encode;
use URI::Escape;

my $utf8String = 'テスト';

my $urf8BytesEsc = uri_escape(encode('utf8', $utf8String));
my $eucBytesEsc = uri_escape(encode('euc-jp', $utf8String));
my $sjisBytesEsc = uri_escape(encode('shiftjis', $utf8String));

print 'http://www.google.co.jp/search?hl=ja&q=' . $urf8BytesEsc ,"\n";
print 'http://dictionary.goo.ne.jp/search.php?MT=' . $eucBytesEsc , "\n";
print 'http://example.com/search.cgi?sjis=' . $sjisBytesEsc , "\n";

use utf8;
use Encode;
use URI::Escape;

my $utf8String = 'テスト';

my $urf8BytesEsc = uri_escape(encode('utf8', $utf8String));
my $eucBytesEsc = uri_escape(encode('euc-jp', $utf8String));
my $sjisBytesEsc = uri_escape(encode('shiftjis', $utf8String));

print 'http://www.google.co.jp/search?hl=ja&q=' . $urf8BytesEsc ,"\n";
print 'http://dictionary.goo.ne.jp/search.php?MT=' . $eucBytesEsc , "\n";
print 'http://example.com/search.cgi?sjis=' . $sjisBytesEsc...続きを読む

Qperlで、[ \r\n , \n ]の意味は?

シンプルなCGI掲示板の勉強中ですが、

$message =~s/[ \r\n , \n ]/<br \/>/g; となっており、
これは改行文字を<br />に置き換えるのだそうですが、
[ \r\n , \n ]の部分というのはどういった意味でしょうか。

[ abc ]だと、a,b,cのうちどれか1文字は入っていれば良いですよね。
[ ]に「,」が入るとよく分からなくなります。

お分かりの方、教えてくださいませんか。
よろしくお願いいたします。

Aベストアンサー

サンプルは、
$message =~ s/\r\n/<br \/>/g;

$message =~ s/\n/<br \/>/g;
1行で済ませようとして間違ってしまったのでしょうか?

\r 復帰文字(return)

\n 改行(newline)

「,」カンマそのもの

\r 復帰文字 (return)
のいずれかを<br />に置き換える、という意味になってしまうでしょうね。
この目的のためには、

$message =~ s/\r\n/<br \/>/g;
$message =~ s/\r/<br \/>/g;
$message =~ s/\n/<br \/>/g;

と3行記述するのがいいのではないでしょうか?

参考サイトに私が勉強させてもらっているサイトを紹介しておきます。

参考URL:http://www.rfs.jp/sitebuilder/perl/04/07.html

QPerlでハッシュや配列で重複するキーについて

ハッシュで重複するキーが値となるので、このハッシュはabdの3つのキーしか存在しないということでしょうか?
%a = ('a'=>1, 'b'=>2, 'a'=>3, 'd'=>4);

また、配列の場合はabadと4つ数になるということでしょうか?
@a = ('a','b','a','d');

この場合配列で、重複する値を抽出するアルゴリズムが知りたいです。

Aベストアンサー

重複のチェックはこんな感じでいいでしょう。

@a = ('a', 'b', 'a', 'd');

for (@a) {
  if (defined $hash{$_}) {
    print $_, "が重複してます。\n";
    next;
  }
  $hash{$_} = 1;
}

QPerl<->Oracle間での文字化けについて

初投稿になります。過去ログを検索したのですが、似た質問はあるものの根本的な解決につながらなかったので、新規の投稿をさせていただきました。
乱文ご容赦ください。
今現在Oracleサーバ上でPerlのプログラムを組んでいます。とは言えPerlも既存の物を改変できる程度の知識ですし、DBに関しての知識はほぼ皆無です。
それでもNet等を参照しながら、どうにかDB内を参照できるようにはなってきました。が、ここで日本語の取り扱いについて突き当たってしまいました。
まずは以下のPerlファイルをご覧ください。
#ソースの前後は割愛
#DBに接続した後のソース

# 読み込みcharセットの宣言
$dbh->do("set names 'ujis'");

# 動的SQL文の発行
$hSt = $dbh->prepare(" SELECT * FROM DDD WHERE EEE='100001' ");

# 実行
$nRes = $hSt->execute;

# データ取得
while($raRes = $hSt->fetchrow_arrayref) {
print join(",", @$raRes), "\n"; #","区切りで出力
}

#実行すると
DBD::Oracle::db do failed: ORA-00922: ??????????????????????? (DBD ERROR: error possibly near <*> indicator at char 4 in 'set <*>names 'ujis'') [for statement ``set names 'ujis''']) at ./test.pl line 18.
,???????,ABC,??? ??152 ,???? ,??????????123,03-xxxx-xxxx ...
#表示された内容部分はもっと多くのデータでしたが省略してあります

と、散々な結果でした・・・(;^_^ A
どなたか解決方法を教えていただけますか?
あ、最後になりますが環境です。
サーバ:
Oracle9
Perl5.8.0
ソース全体は以下のtxtファイルを参照してください。
ttp://briefcase.yahoo.co.jp/bc/urd_apple/

初投稿になります。過去ログを検索したのですが、似た質問はあるものの根本的な解決につながらなかったので、新規の投稿をさせていただきました。
乱文ご容赦ください。
今現在Oracleサーバ上でPerlのプログラムを組んでいます。とは言えPerlも既存の物を改変できる程度の知識ですし、DBに関しての知識はほぼ皆無です。
それでもNet等を参照しながら、どうにかDB内を参照できるようにはなってきました。が、ここで日本語の取り扱いについて突き当たってしまいました。
まずは以下のPerlファイルをご覧ください...続きを読む

Aベストアンサー

perl5.8で、DBI+DBD-ORACLEが動作したっけ?
っていう疑問はあるんですが、きっと今は動くのですよね。

>$dbh->do("set names 'ujis'");

オラクルは、そのようなSQLを投げられても処理できません。
今は、これが邪魔してエラーになっています。

基本的に、オラクルサーバ-クライアントの文字コード処理は、NLSが自動で行います。
perlが動作する環境のNLS_LANGに従って変換された日本語文字が受け取れる仕組みです。
(文字コードがあっているかどうかはともかく、それで受け取れる)

もし、オラクルクライアントの設定と違った文字コードで無理矢理受け取りたいなら、
コネクト前に、
$ENV{'nls_lang'}="JA16SJIS";
とか
$ENV{'nls_lang'}="JA16EUC";
とすれば、SJISやEUCで受け取れるハズです。

他にも、SQL文の投入でも一時的変更は可能なハズですが。

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。


人気Q&Aランキング