こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

MySQLに登録すると文字化け

Perlのスクリプトで、MySQLにユーザー情報を登録しているのですが、
二つのDBに登録しています。

一つ目のDBはEUC-JPで、もう一つがUTF-8のMySQLになっています。
具体的には、最初はあるCMSのユーザー登録を別のPerlスクリプトで行い正常に保存されていたのですが、今年の春頃からWordpressも使う必要があり、そちらがUTF-8のDBなのです。

英数字なら問題なく登録可能なのですが、日本語が入ると、UTF-8のDBでは文字化け等が発生して、正常に登録されませんでした。
ちなみに、Perlスクリプト自体はEUC-JPで記述・保存されているファイルなのですが、先述の通り、先のCMS側のDBがEUC-JPなので、このPerl自体をUTF8にするわけにもいかず・・・

以下のようなソースになっています。

------------------------------------------------------------------------

# データベースへアクセス
$dbh = DBI -> connect ("DBI:mysql:$dbname:$dbhost",$dbusername,$dbpassword)
or show_ErrorPage('データベースにアクセス出来ません。');

#$dbh->do("set names utf8");

#$data{'username'} = decode('utf8', $data{'username'});
#$data{'username'} = encode("shiftjis",decode("euc-jp",$data{'username'}));
#$data{'username'} = encode("euc-jp",decode("utf8",$data{'username'}));
#$data{'username'} = Encode::from_to($data{'username'}, 'utf8', 'euc-jp');
#utf8::decode($data{'username'});
#$data{'username'} = Encode::from_to($data{'username'},'euc-jp','utf-8');

$sth = $dbh->prepare( qq{ INSERT INTO $table2 (ID,user_login,user_pass,user_nicename) VALUES("$rows[0]", "$data{'username'}","$data{'password'}", "$data{'username'}") } );

$sth -> execute()
or show_ErrorPage("データベースを実行出来ませんでした。$DBI::err ($DBI::errstr)");

$sth -> finish();

$sth2 = $dbh->prepare(qq{ SELECT ID FROM $table2 WHERE user_login = "$data{'username'}"});

$sth2 -> execute()
or show_ErrorPage("データベースを実行出来ませんでした。$DBI::err ($DBI::errstr)");

@rowss = $sth2->fetchrow_array;

$sth2 = $dbh->prepare( qq{ INSERT INTO $table3 (user_id,meta_key,meta_value) VALUES
("$rowss[0]","first_name",""),
("$rowss[0]","last_name",""),
("$rowss[0]","nickname","$data{'username'}");

$sth2 -> execute()
or show_ErrorPage("データベースを実行出来ませんでした。$DBI::err ($DBI::errstr)");

------------------------------------------------------------------------

少し省いている部分もあり、数字等に間違いがあるかもしれません。
このPerlはフォームスクリプトで、$data{'username'}にユーザー名を入力してもらいます。
それを「user_login」や「user_nicename」に登録をしたいのですが、先のEUC-JPのDBでは問題ありませんが、UTF8のDBでは空白になります。
その後色々調べてみて、上記コードの#の部分を追加して試してみましたが、空白ではないものの文字化けになったり数字になって登録されてしまうようになりました。

やりたいことは、「$data{'username'}」という変数をUTF8に文字エンコードをしてWordpress側のDBに登録を行いたいのです。

その後「perl utf8 フラグ」などのキーワードを知り調べてみましたが、具体的に自分の知識では解決できずに悩んでおります。

もし宜しければご教示頂けますと幸いです。
宜しくお願い申し上げます。

投稿日時 - 2014-12-15 12:39:11

QNo.8859054

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

8人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

データベースについてはわからないので、解決に役に立たないかもしれません。

Perl の Encode.pm の encode() と decode() には、一般の「エンコード/デコード」とは少し違ったところがあります。Encode.pm では、「デコード → エンコード」の順番で処理します。また、from_to() 関数は第1引数を直接コード変換して、戻り値として変換した文字数 (失敗した場合は undef) を返すので、元の変数に代入してはいけません。

$data{'username'} = encode("utf8",decode("euc-jp",$data{'username'}));
または、
Encode::from_to($data{'username'}, 'euc-jp', 'utf8');

投稿日時 - 2014-12-15 18:51:53

あなたにオススメの質問