日 | 月 | 火 | 水 | 木 | 金 | 土 |
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
文字サイズ変更:



トップページ > Perlについて
●Perlについて●
2023-03-17 17:30:55wide characterとエラーが出た時

wide characterとエラーが出た時の対処法をメモ書きします。
cgiにあらかじめ、use utf8; をしていて、
ファイル出力すると「wide character」とエラーが出ることがあります。
対処法から先に書くとしたら、「use Encode;」をして、
エラーの原因と思われる個所で(十中八九日本語文字の所でしょう)
my $new_word = Encode::encode('utf-8', $word);
とエンコードします。
(※全角カンマを使用しています)
理由と思われるサイトを貼り付けます。
(昨今の)Perlには「utf8フラグ」なるものがあります。
通常、日本語の仮名や漢字は、複数の文字を組み合わせて表現しています。
例えば、「ア」という文字は
Shift_JISなら x83x41 という「2文字」
UTF-8なら xE3x82xA2 という「3文字」
です。
この状態は、1バイト1バイトの文字が並んでいる状態なので、「バイト列」と呼ぶことにします。(バイナリと呼んだりもします)
ファイルには、この形で入っています。
この方式だと、「ア」が1文字として扱われずいろいろと不便です。
例えば、 Shift_JISのアに含まれる x41 はASCIIコードでのAです。
ここで、s/A/B/ とすると、 AがBに書き変わるだけでなく、ア( x83x41)がィ (x83x42)に書き変わってしまいます。
そこで、これらを統一扱う「内部形式」というのを作りました。
それが「utf8フラグ付き文字列」です。
読み込み時は
ファイルや文字列変数でのバイト列 → 復号( decode ) → 内部形式(utf8フラグ付き文字列)
書き出し時には
内部形式 → 符号(encode) → ファイルや文字列変数でのバイト列
とすることで、内部形式では「ア」を一文字として扱うことができます。s/A/B/としてもアには影響ありません。
復号/符号 は入出力時に自動で行なうようにしたり、Encodeモジュールのdecodeï¼encode等を使用して明示的に行なったりします。
この書き出しの時に、
内部形式 → 符号(encode) → ファイルや文字列変数でのバイト列
としなければならないところを
内部形式 → ファイルや文字列変数
と直接おこなってしまった場合、そんなことはできない、と発生するのが「 wide character 〜」の警告です。
対処法は、 上記のようにencodeすることです。
また、場合によっては decode を抑制して 最初からバイト列で扱う方が正しいこともあります。
記事はここまで。
出典「教えてgoo! perl でエラー:Wide character in・・・とは何がいけないのでしょう?」
Print
Twitter(test)
short URL
いいね:13 back to the TOP |
![]() |
![]() |
![]() |