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

エラーメッセージ:
Wide character in subroutine entry at C:/Perl64/lib/Encode.pm line 221.

この意味と対応策を教えてください。

A 回答 (3件)

(昨今の)Perlには「utf8フラグ」なるものがあります。




通常、日本語の仮名や漢字は、複数の文字を組み合わせて表現しています。
例えば、「ア」という文字は
Shift_JISなら \x83\x41 という「2文字」
UTF-8なら \xE3\x82\xA2 という「3文字」
です。
この状態は、1バイト1バイトの文字が並んでいる状態なので、「バイト列」と呼ぶことにします。(バイナリと呼んだりもします)
ファイルには、この形で入っています。

この方式だと、「ア」が1文字として扱われずいろいろと不便です。
例えば、 Shift_JISのアに含まれる \x41 はASCIIコードでのAです。
ここで、s/A/B/ とすると、 AがBに書き変わるだけでなく、ア( \x83\x41)がィ (\x83\x42)に書き変わってしまいます。

そこで、これらを統一扱う「内部形式」というのを作りました。
それが「utf8フラグ付き文字列」です。

読み込み時は
 ファイルや文字列変数でのバイト列 → 復号( decode ) → 内部形式(utf8フラグ付き文字列)
書き出し時には
 内部形式 → 符号(encode) → ファイルや文字列変数でのバイト列
とすることで、内部形式では「ア」を一文字として扱うことができます。s/A/B/としてもアには影響ありません。

復号/符号 は入出力時に自動で行なうようにしたり、Encodeモジュールのdecode,encode等を使用して明示的に行なったりします。

この書き出しの時に、
 内部形式 → 符号(encode) → ファイルや文字列変数でのバイト列
としなければならないところを
 内部形式 → ファイルや文字列変数
と直接おこなってしまった場合、そんなことはできない、と発生するのが「 wide character 〜」の警告です。


対処法は、 上記のようにencodeすることです。
また、場合によっては decode を抑制して 最初からバイト列で扱う方が正しいこともあります。
具体的なことは、実際のコードとやろうとしていることがわかならないと答えられません。
    • good
    • 2
この回答へのお礼

とても丁寧なご教示有難うございます。
shift-jisで処理していますので、最初に、
Encode::from_to($content, "shift-jis", "euc-jp");
と書き込み、データ出力前に
Encode::from_to($content, "euc-jp", "shift-jis");
と言うような形で対応するのでしょうか?
重ねてご教示頂けましたら有難く存じます。

お礼日時:2015/12/17 23:32

$content が utf-8 フラグのついた文字列である場合,


Encode::from_to($content, "utf-8", "shift-jis");

$content = Encode::encode($content, "shift-jis");
と同じになります (個人的に from_to は使ってないのでちょっと違うかもしれん).

最後の
「エラーメッセージはあっても関係ない、
ということでしょうか」
は, 何を聞いているんでしょうか?
    • good
    • 2
この回答へのお礼

有難うございます。
$content = Encode::encode($content, "shift-jis");
を入れてみます。

お礼日時:2015/12/21 19:01

そうとう昔の Perl から内部的には UTF-8 を使うので


1. 外から与えられた文字列は Encode::decode で UTF-8 に変換する
2. その UTF-8 な文字列を使って処理をする
3. 外に出すときに Encode::encode でそれなりな文字コードに戻す
とするんだよ... と #1 はいっている.
    • good
    • 0
この回答へのお礼

有難うございます。
Encode::encode でそれなりな文字コードに戻って帰って来る
ということですか。
Encode:from_to($content,"utf-8","shift-jis"); 
としなくてもよい、ということですか。
エラーメッセージはあっても関係ない、
ということでしょうか。
もう少し教えて頂けるとありがたいのですが。

お礼日時:2015/12/19 18:29

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

このQ&Aを見た人はこんなQ&Aも見ています