公式アカウントからの投稿が始まります

下記のperlのソースで文字化けが出る。wide characterのエラーが出ます。
use LWP::Simple;
print get('https://opac.toshokan.city.fukuoka.lg.jp/licsxp- …

ソースはcp932
urlはutf-8で書かれています。

utf-8フラグの関係だとは思いますが。
対処が分かりません。

エラーが出ない様なperlのソースをご提示願います。

A 回答 (3件)

utf8文字列は、内部用の特殊なエンコーディングだと解釈するのがいいかもしれません。


UTF-8のバイト列としての文字列と、utf8フラグ付き文字列とでは、扱いが違います。
UTF-8のバイト列であっても、decode処理しなければutf8フラグ付き文字列にはなりません。

LWP::Simpleのgetは、外部のコーディングが何であろう(相手がshift_jisでも)と、内部用のutf8文字列で返す。
外部に出力するときは、内部用のをそのまま出力できないので、その出力先に合せてencodeで適切なコーディングに変換する。
ということです。
    • good
    • 0
この回答へのお礼

有難う御座いました。
LWP::Simpleのgetが、その様な動作をしているとは
知りませんでした。

他にも未だ気になる所が有りすが。
またの機会にしたいと思います。

お礼日時:2015/10/06 08:07

> binmode STDOUT,':utf8' ; # STDOUTにはUTF-8にencodeして出力する



は、UTF-8で表示される端末等を対象にした方法です。
UTF-8 以外のコードで表示される場合(WindowsのCMD等)、適切なコーディグを指定する必要があります。
    • good
    • 0
この回答へのお礼

有難う御座います。
下記で動いていますが、宜しいんでしょうか。
理屈が良く分かっていないのですが。

これは、内部はutf8で動作をしていて。外部もutf8で書かれていて。
そのまま読み込むとutf8で取りこまれる。

内部の操作は共にutf8で正常に動作はするが。
出力でwindowsはsjis対応なので文字化けをする。
だから、utf8をsjisに変換をする。

と言うこの様な理屈で会っているのでしょうか???
今一自信が持てないので再度質問をしました。
宜しく、お願いします。

use utf8;
use LWP::Simple;
binmode STDOUT,':encoding(cp932)' ; # STDOUTにはUTF-8にencodeして出力する
use Encode;

print get('https://opac.toshokan.city.fukuoka.lg.jp/licsxp- …

お礼日時:2015/10/04 16:46

「wide character perl」とかで検索すればわかるのですが、utf8フラグ付きの文字列をそのまま出力しようとすると発生します。



入力時は
外部のUTF-8,ShiftJIS 等のバイト列 → decode → utf8フラグ付き文字列

出力時は
utf8フラグ付き文字列 → encode → 外部のUTF-8,ShiftJIS 等のバイト列

と 特定の文字コードでのバイト列 と 内部で使うutf8フラグ付き文字列 とを変換して使います。


またはIOレイヤーを使って、入出力時の文字コードを指定します

#ファイルを開くときに指定する
open($fp, ':encoding(cp932)', $filename ) ; # $filenameをCP932として読み込むように設定する

# 既に開かれているファイルをbinmodeで変更する
binmode STDOUT,':utf8' ; # STDOUTにはUTF-8にencodeして出力する
    • good
    • 0
この回答へのお礼

有難う御座います。
下記の様に修正した所エラーは出ませんでしたが、今度は大量の文字化けが発生します。

use LWP::Simple;
binmode STDOUT,':utf8' ; # STDOUTにはUTF-8にencodeして出力する
use Encode;

print get('https://opac.toshokan.city.fukuoka.lg.jp/licsxp- …

文字化けを防ぐためには、どこを修正すれば良いのでしょうか???

お礼日時:2015/10/04 11:21

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