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

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

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

お世話になります。Googleやbingなどで調べて見ましたが検討もつかず困っております。 PerlでDBIを使用し、データベースのテーブルAに対してSelectした場合に、fetchrow_hashrefを使用しSelect結果を取得した場合に、テーブルの列名が文字ではなく文字コードが格納されてしまいます。 テーブルAの列名はUTF-8の日本語文字になります。 以下、列名 ID|登録者|登録日 fetchrow_hashrefを使用した場合、以下のように返ってきます。 $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 }; 問題は目的のデータに対して列名('登録日'など)で参照する事が出来ない事ですが、今のままテーブルの列名は日本語のままで回避する方法をご教授いただけないでしょうか? hashrefを使いたい理由はテーブルの列順番が変わった場合でもプログラム上の変更を減らすために、列名にて参照したいためです。ですのでarray系の取得メソッドはなるべく使わないようにしたいです。 出来ればなぜこのようなことが起こるのか原因も含めてご教授いただけると大変助かります。。 ちなみに、データベースはPostgreSQLの8.2で日本語文字に対応していることは、自分でselectなどのコマンドを叩き確認済みです。 ヒントでもかまいませんので、どうかよろしくお願いいたします。

noname#229108
noname#229108
  • Perl
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
  • 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

  • データベースから取り出した日本語が化けるのですが

    PHP初心者です。 データベースから取り出した日本語が化けるのでなにか直す方法は無いものかと悩んでおります。今のところアルファベット、数字は問題ありません。 構成はこんなかんじです。 Linux : Vine 2.5 PHP : PHP-4.2.1 DB : Postgresql-7.2 apache 1.3.26 現象: クライアントPCからwebでデータベースに日本語入力は出来ます。 データベースにターミナルから直接入り(psql [DB名])、(select * from [テーブル名];)で確認すると問題無く登録した通りに入っています。 クライアントPCからwebでデータベースの検索をして 拾い出したデータをクライアントPCのweb上で表示をすると文字化けし、 登録した文字とはほどとおいものが出て来ます。 "あ"と登録すると $$ などと出て来ます。 なにかいい方法がありましたら、教えて下さい。

    • 締切済み
    • PHP
  • 文字コードについて

    データベースの文字コードとアプリケーションの文字コードが異なる場合、書き込み(INSERT)や取り出し(SELECT)はどのような扱いになるのでしょうか? イメージ的にはデータベースがUTF-8の設定の場合に、アプリケーションがSJISを指定し読み取ったデータをINSERTする場合や、SELECTで取り出す場合に何が問題になるのかを知りたいです。 質問の意図はアプリケーションやデータベースを国際化を意識して作成したく、アプリケーションはVB.NETで、CSVのファイルをsjisを指定して読み込み、それを書き込む際にそのままInsertやSelectを指定して問題ないのか、そもそもCSVファイルにはUTF-8で書き込み、読み込みもUTF-8ですべきなのでしょうか? ちなみにUTF-8がAsciiが1バイト、日本語が3バイトで扱われ、SJISの場合は、Asciiが1バイト、日本語が2バイトで扱われることは理解しています。

  • 日本語の文字化け

    APACHE、MYSQL、PHPである本をもとに住所録を作りました。ブラウザには問題なく登録した氏名、住所などが表示されましたが、ターミナルでselect * form テーブル名を実行してみると、日本語が文字化けしています。同様にPHPmyadminのほうでも日本語が文字化けしています。ブラウザにはきちんと表示されるので、この本を読みすすめていく分には問題ないのですが、今後絶対に困ると思われますので、今のうちに直したいです。原因と修正方法を教えて下さい。 apache 1.3.3 MYSQL 4.0.27 PHP 4.4.1 MAC OS X 10.4.8 よろしくお願いします。

  • ポルトガル語と日本語の混在

    MySQL 5 で、ポルトガル語と日本語が混在したデータを扱いたいのですが、キャラクタセットは UTF8 でいいのでしょうか? データベース、テーブル、フィールドのすべてをデフォルトをUTF8にしたのですが、ポルトガル語の一部と、日本語が文字化けしてしまいます。 日本語のデータベースもありますので、 MySQLのデフォルトは eucjpms を使用しています。 なかなか上手くできません。よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 日本語の使用

    Access2002を使用してデータベースを作る時の質問です。 テーブル名やフィールド名などに日本語は使用しない方がいいのでしょうか? 使用した場合に発生する問題などがありましたら、教えてください。 よろしくお願いします。

  • 日本語の変換

    すみません。phpで質問です。 ユーザーから受け取った文字列(日本語漢字、ひらがな、かたかな含む)をローマ字とうに変換することはできますでしょうか? 受け取った文字列をsqliteのテーブル名にしたいのですが、日本語は使いづらいみたいなので、ローマ字に変換したいです。

    • ベストアンサー
    • PHP
  • SQLServer2005と文字コード

    ある米国のJavaで作られたWebアプリケーションパッケージソフトウェアをインストールしました。環境はSQLServer2005 + Tomcat 6.0で、その上にこのパッケージがインストールされて動作しています。基本的に米国の製品なので英語を前提としていますが、今回は日本語のOS、日本語SQLServer上にインストールしました。このパッケージソフトウェアがパッチを提供しているので、それを適用しようと思いました。そこでインストラクションを読んでいるのですが、その中に「UTF-8ベースのデータベースを使っている場合は」というような記述があります。そこで初めて文字コードというものを意識し、自分の構築したSQLServer2005の文字コードを調べたいと思いました。私の知識は古くはUNIX系がEUC、Windows系がShift-JISで最近はUnicode(UTF-8方式)が主流?、という程度です。ウェブで調べたところどうもUTF-8にするには?テーブルの型をnvarcharなど「N」を付して作成しなければならないというようなことがわかりました。このアプリが使用するテーブル群はすべてパッケージが提供するSQLのスクリプトで作成したものですが、nvarcharでなくvarcharになっていました。ということは、UTF-8ではないということでしょうか?そもそも文字コードというのはテーブルのコラム単位なのでしょうか、それともデータベースとかもっと上位の単位なのでしょうか?SQLServer Management Studio Express上でデータベースなどいろいろな個所を右クリックしてプロパティを見ていますが特にUTF-8とかUnicodeといった記述は見つかりませんでした。このデータベースは何という文字コードなのでしょうか?調べ方をご存じの方、ご教示願います。よろしくお願いします。

  • Perl5.6.1での「5C」コードの文字化け対策について

    Perl5.6.1でCGIを動作させています。 下記コードで「テーブルyyy」から「列xxx」を引っ張ってきて xxxのデータ(文字列)を変数test2に格納しようとしているのですが、 xxxのデータ(文字列)内に2バイト目が「5C」コードの文字(表・予・申など)が含まれる場合、「Can't call method "Fields" on an undefined value at C:\~~~.cgi line 行数」というエラーが発生してしまいます。 このエラー出力で表示される行数はtest2に文字列を格納する行で発生しているのですが、既存のPerl5.6.1のままでエスケープ・置換処理をどのように行えばよいのでしょうか。 以上、よろしくお願い致します。 use Win32::OLE; $db = Win32::OLE->new("ADODB.Connection"); $db->Open($conn); $test = $db->Execute("SELECT xxx FROM yyy WHERE zzz=aaa"); $test2=$test->Fields('xxx')->Value;

  • フォルダ名が日本語の場合の文字化けについて

    PHP Version 5.3.1 MySQL Version 5.1.41 です。 以前、プログラム(PHP)からデータベースに日本語のデータを挿入すると文字化けしていたので、 プログラムからデータベースを利用する際に「SET NAMES utf8」をセットしてから挿入したら 文字化けがなくなりました。 そして今度は、日本語で書かれたフォルダ名をプログラムから取得したら 文字化けしていた(データベースに挿入しても文字化けしたままです)ので、 「SET NAMES sjis」にセットし直して、日本語のフォルダ名をデータベースに 挿入したらそのデータに関しては文字化けが起こらなかったのですが、 今度は当然ながらプログラムに記述していた日本語のデータを挿入したら文字化けになりました・・・ [SET NAMES utf-8 の場合] $arr = array('日本語'); → データベースへ挿入 → 文字化けなし プログラムで取得した日本語のフォルダ名 → データベースへ挿入 → 文字化けする [SET NAMES sjis の場合] $arr = array('日本語'); → データベースへ挿入 → 文字化けする プログラムで取得した日本語のフォルダ名 → データベースへ挿入 → 文字化けなし プログラムの側では両方とも同時に挿入する感じなので、その都度「SET NAMES~」で 切り替えたりするのは難しい状況のですが、なにか良い解決方法はありますでしょうか?

    • ベストアンサー
    • PHP
  • 日本語の文字コードについて

    日本語の文字コードの扱いに詳しいかた教えてください。 私は『webザテレビジョン』というホームページでキーワード検索をすることが多いのですが、 お決まりのキーワードを毎回手入力 (若しくはコピペ) するのが面倒な為に、以下のような ショートカットのURLを書いてお気に入りに登録してあります。 http://www.television.co.jp/programlist/search.php?s_text=(ここにキーワード入力)&type=tv これで、お気に入りをクリックするだけで検索結果が表示されるようになったのは良いのですが 問題もまだ残っておりまして、キーワードが日本語の場合その文字コードが『UTF-8N』でないと ダメなようです。 今、テキストエディタにて仮に『榮倉奈々』と入力してそれを『UTF-8N』で保存し、そのファイル を『SJIS』モードで開いた時の文字列(文字化けが怖いので記載は省略します)をキーワードの欄に 入力して検索しようとすると『々』という文字が文字化けしてしまって、検索が出来ません。 他にも『子』という文字も問題でして、『子』を使う場合には『子□』(□は全角ブランクの意) としてキーワード作成しないと文字化けしてしまいます。 『UTF-8N』を強引に『SJIS』で表示させて、しかもそれをコピペしてURLを書いていることが 問題だとは思うのですけれども、この問題を上手に回避出来る方法をご存知の方がいらっしゃい ましたら教えて戴きたいと思います。

専門家に質問してみよう