• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Perlで変数内の日本語が文字コードに変換される)

Perlで変数内の日本語が文字コードに変換される

このQ&Aのポイント
  • PerlでDBIを使用し、データベースのテーブルAに対してSelectした場合に、fetchrow_hashrefを使用しSelect結果を取得した場合に、テーブルの列名が文字ではなく文字コードが格納されてしまいます。
  • hashrefを使いたい理由はテーブルの列順番が変わった場合でもプログラム上の変更を減らすために、列名にて参照したいためです。
  • データベースはPostgreSQLの8.2で日本語文字に対応していることは、自分でselectなどのコマンドを叩き確認済みです。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

fetchrow_hashrefが「一般的」では無い文字(≒いわゆる半角英数記号以外)を\でエスケープした形式で表示しているだけで、実際には \x{767b}→登 です。 $a = $VAR1->{'登録日'}とすれば $aに2012-05-06 00:52:40.39496が入ります。 (use utf8;してあって、スクリプト自体がUTF-8で記述されている場合) このあたりの扱いは少々ややこしいので、下記のようなサイトや参考書をよく読むことをお勧めします http://perldoc.jp/docs/perl/5.10.0/perlunicode.pod http://www.rwds.net/kuroita/program/Perl_unicode.html

noname#229108
質問者

お礼

ご回答ありがとうございます!

noname#229108
質問者

補足

ソースコード事態はUTF8で記述していましたので、 use utf8;にする事で取得出来ることが出来ました! ありがとうございます! ただ・・・。取得することが出来ましたが、取得した値が日本語の場合は、逆に文字化けしてしまいました。。。 ちなみに、use utf8;をコメントアウトし、fetchrow_arrayrefにて取得すると、文字化けは起こらなかったのでutf8をuseすることによって値に何らかの加工をしているみたいですが、、、ご存知でしょうか?? ちなみに、utf8フラグがついているからかな?と思い utf8::encode にて調べてみましたがfalse値が返ってきていました。。。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

ひとえに「文字化け」といってもいろんな状況が考えられるのですが, どう「化け」ているのでしょうか? 極端には「実はなにもおかしくない (化けてもいない) んだけど確認のしかたが間違っているために化けているように見える」かもしれないですし. 本当に化けているとしたらバイナリレベルでコードを知りたいところ.

noname#229108
質問者

お礼

ありがとうございます。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

あ, \x{767b} って UTF-8 じゃなくて UTF-16 なんだ.... ところで, #1 への補足にある 「(use utf8; すると) 取得した値が日本語の場合は、逆に文字化けしてしまいました」 ってのは, 具体的にはどんな状態なんでしょうか? 「逆に」の意味が分からんのだけど, 質問の時点で出ている $VAR1 = { "\x{767b}\x{9332}\x{8005}" => '106.190.xxx.xxx', "\x{767b}\x{9332}\x{65e5}" => '2012-05-06 00:52:40.39496', 'id' => 38 }; は「文字化け」ではないという認識でしょうか? そもそも「データベースにどんな文字コードで入れたのか」とかから始まりそうな感じもするんだけど....

noname#229108
質問者

お礼

ご回答有難うございます!

noname#229108
質問者

補足

use utf8; を行うことによって、 「fetchrow_hashref->{'登録者'}」で参照し、値を取得することが出来ました。 値は「106.190.xxx.xxx」 ただ、データベースの内容に以下のようにデータが入っている場合、 ID|名前|登録者|登録日 '38' 'なまえ' '106.190.xxx.xxx' '2012-05-06 00:52:40.39496' に「名前」を「fetchrow_hashref->{'名前'}」で取得した場合に値は「なまえ」が取得出来ると思いましたが、 文字化けした値が取得出来ました。 データベース・ソースコードはUTF8で作成しており、テーブルの中の文字列もUTF-8になっております。 そういう意味で、 use utf8; を行わなければhashのkey値は"\x{767b}\x{9332}\x{8005}"の状態。 use utf8; を行えばhashのkey値は"登録者"で参照出来ますが値は文字化けしてるので参照は出来るが値が文字化けしてしまうというという意味で「逆」と使いました。 ※うまく伝えられずすみません。 また、 上記のテーブルの状態でも use utf8; をコメントアウトし、 「fetchrow_arrayref->[1]」で参照すると、「なまえ」と正しい値が取得することが出来ましたので、 use utf8; を行うことによって何らかの値に加工を行なっているのではと考えつくことが出来ましたがもう少しお力添えをお願い出来ればと思います。 すみませんが、よろしくお願い致します。。。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

UTF-8 ってわかってるなら全て UTF-8 で扱うのが自然だし単純だろう.

noname#229108
質問者

お礼

ご回答ありがとうございます!

noname#229108
質問者

補足

>UTF-8 ってわかってるなら全て UTF-8 で扱うのが自然だし単純だろう. そうですね!!

すると、全ての回答が全文表示されます。

関連するQ&A