カタカナ「ソ」の文字化けについて

このQ&Aのポイント
  • Shift-JIS環境でCGIを動作させている際にカタカナ「ソ」の文字列が文字化けする問題について解決方法を教えてください。
  • データベース内に保存されているカタカナ「ソ」の文字列が読み込んだ際に文字化けするので、再度書き込む際に文字化けしない方法を教えてください。
  • カタカナ「ソ」の文字化け問題に関して、Shift-JIS環境で動作しているCGIのプログラム内での対処方法を教えてください。
回答を見る
  • ベストアンサー

カタカナ「ソ」の文字化けについて

いつもお世話になります。 現在Shift-JIS環境でCGIを動作させているのですが、データベース(shift-jis)内に「ヒソカ」という文字列があり、この文字列を、 読み込んで→再度書き込み 【ソース】 $SQL = $dbh->prepare( qq{ SELECT * FROM User WHERE `id` = "$in{'id'}" }) $SQL -> execute(); @DATE = $SQL ->fetchrow_array(); ※@DATE [0]にその文字列が入っています。 (varchar(30)) とした際「ヒャJ」となります。 恐らく「http://www.shtml.jp/mojibake/sjis_cgi.html」で書かれている問題だと思うのですがどうにか対処する方法はないでしょうか。 何卒よろしくお願い致します。

  • CGI
  • 回答数1
  • ありがとう数0

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

データベースへinsertする時点でエスケープ処理が必要です $quoted_str = $dbh->quote($str); これで ヒソカ が 'ヒソ\カ' にエスケープされます

関連するQ&A

  • fetchrow_arrayとfetchrow_hashrefの使い方

    Jやまとです。 PerlからSELECT文を実行して結果の行の値を取得する単純なスクリプトを作成しています。 (1)fetchrow_array使用 (2)fetchrow_hashref使用 以上2通りの方法で試したのですが、(2)がInternal Server Errorになります。 原因が全く分かりません。 分かる方いらしゃいましたら、ご教授願います。 OS:TurboLinux6.2 DB:Oracle8i Apache,PerlはTurboLinux6.2に入っているものをそのまま使用 以下、ソースを記載します。 --------------- (1)fetchrow_arrayを使用して行の値を取得(こっちは動く) $dbh = DBI->connect($ds, $user, $pass) || &dbErr("Database can't connect." . $DBI::errstr); $sql = "SELECT SYSDATE FROM DUAL \n"; $sth = $dbh->prepare( $sql ); $sth->execute or die "Cannot execute. " . $sth->errstr(); $cnt1 =1; while (@row = $sth->fetchrow_array()) { @{$get_date[$cnt1]} = @row; $cnt1++; } --------------- (2)fetchrow_hashrefを使用して行の値を取得(こっちが動かない) $dbh = DBI->connect($ds, $user, $pass) || &dbErr("Database can't connect." . $DBI::errstr); $query = qq{ SELECT SYSDATE FROM DUAL }; $sth = dbh->prepare($query); $sth->execute(); # 実行 if($sth->rows() != 1){ # 該当する行数 # エラー処理 } $rhash = $sth->fetchrow_hashref(); %hash = {%{$rhash}}; $sth->finish(); $get_date = $hash{SYSDATE}; --------------- (2)実行時のerror_log Can't locate object method "prepare" via package "dbh" at /u01/ora1/www/htdocs/hoge.cgi line 30. Premature end of script headers: /u01/ora1/www/htdocs/hoge.cgi --------------- (本文長くてすみません)

    • ベストアンサー
    • Perl
  • カタカナの「ソ」以降の文字が文字化けします

    propertiesファイルから文字列を読み込む処理を行っているのですが、文字列にカタカナの「ソ」がはいると、「ソ」自体とそれ以降の1文字が文字化けしてしまいます。 これには何か対処方法があるのでしょうか? こんな感じの処理を行っています。 【propertiesファイルの内容】 path=C:\\MyWork\\ソース\\download 【読み込み処理】 FileInputStream fis = new FileInputStream(propfile); Properties prop = new Properties(); prop.load(fis); String sjs_path = getString(prop.getProperty("path"); String uni_path = new String(sjs_path.getBytes("iso-8859-1"), "Shift_JIS"); アドバイスよろしくお願いいたします。

    • ベストアンサー
    • Java
  • 日本語だけ文字化け

    Solaris上で、Perl(5.005_03)を用い、DB(Oracle10.2.0)のデータを抽出しブラウザで表示させた際に、日本語のみが??????という感じに、半角の"?"で表示されてしまいます。 Solaris上で、cgiファイルを標準出力したり、Perlのデバッガで表示させると問題なく日本語表示されます。また、ブラウザでもDBから抽出した文字以外の日本語は問題なく表示されます。加えて、OUT関数を用いても、やはりDBから抽出した値のみ?表記になってしまいます。 下記に利用したCGIを書き出してみます。(DB接続以降の記述のみ) ------------------ここから--------------------- my $dbh = DBI->connect($datasrc, $username, $password) || die DBI::errstr; my $sql = "SELECT AAA FROM XXXXX"; my $sth = $dbh->prepare($sql) || die $dbh->errstr; $sth->execute || die $dbh->errstr; print "Content-type: text/html\n\n"; print "<HTML>\n<HEAD>\n"; print "<TITLE>DBテスト</TITLE>\n"; print "<meta http-equiv=Content-Type content=text/html; charset=Shift_JIS>\n"; print "</HEAD>\n<BODY>\n"; print "DB接続テスト<P>\n"; # display results my @results; my $count; while($count < 2) { @results = $sth->fetchrow; print "あああ"; print "@results\n<P>"; print ,$count++,"行目\n"; } $sth->finish; $dbh->disconnect; print "\n</BODY>\n</HTML>\n"; ------------------ここまで--------------------- ブラウザ表示の結果は、 DB接続テスト ???????? ???????? となってしまいます。"DB接続テスト"は正常に表示されて、print "@results\n<P>";が????に置換わり、"行目\n"が非出力となってしまいます。DB(AAA列)の値が数字や英数は問題なくブラウザ表示されます。 日本語全てが一律文字が置き換わるのであれば、文字コードの問題だと疑うのですが、SELECT文の日本語のみが、?というのはどうしてなのかがわかりません。また、Solaris上でのデバッガーや標準出力は問題なく、ブラウザやOUT関数でファイルに書き出すと、?になるのもわかりません。 もし、ご存知の方がいらっしゃいましたら、教えてくださいm(_ _)m

  • レコード削除・sqlインジェクション対策

    このようなSQL文は危険でしょうか? $sql = "delete テーブル名 where id = :id"; $stmt = $dbh->prepare($sql); $stmt->execute(array(":id" => $_POST['id'])); 上記の例だと、$_POST['id']は、 ちゃんとエスケープできているのでしょうか?

    • ベストアンサー
    • MySQL
  • ハッシュのキー追加について

    とある既存プログラムに機能追加したいのですが上手くいきません。 ハッシュだとは思うのですが、%だったり$だったりしてよくわからなくなってしまいました。 どこがおかしいか教えていただけないでしょうか。 <概要> もともとあった(1)と(3)の処理の間に、(2)を行う <ソース> (1)DBから1レコードを取得する $sql = "select * from tenpo where id=5;"; $sth = $dbh->prepare($sql); $sth->execute(); $shop = $sth->fetchrow_hashref(); (2)別TABLEから値を取得し、(1)に追加する $sql = "select todoufuken from area where id=5;"; $sth = $dbh->prepare($sql); $sth->execute(); @todoufuken= $sth->fetchrow_array; $shop{place} = $todoufuken[0]; (3)$shopの情報をサブルーチンに渡す ソース略

    • ベストアンサー
    • Perl
  • Mysqlの接続について

    現在、以下のようなperlのスクリプトを作っているのですが、mysqlへの接続,切断は以下の場合、どちらにした方がいいのでしょうか? (1)の場合 use DBI; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth = $dbh->prepare("SELECT no,title,name,date,host From `table1` where no='1'"); $sth->execute; $sth->fetchrow_array; $sth->finish; $sth2 = $dbh->prepare("SELECT no,title,name,date,host From `table2` where no='1'"); $sth2->execute; $sth2->fetchrow_array; $sth2->finish; $dbh->disconnect; (2)の場合 use DBI; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth = $dbh->prepare("SELECT no,title,name,date,host From `table1` where no='1'"); $sth->execute; $sth->fetchrow_array; $sth->finish; $dbh->disconnect; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth2 = $dbh->prepare("SELECT no,title,name,date,host From `table2` where no='1'"); $sth2->execute; $sth2->fetchrow_array; $sth2->finish; $dbh->disconnect; (1)の場合と(2)の場合の違いは、(1)の場合、最初にデータベースに接続して、一番最後に切断する事で、(2)の場合、毎回データベースへの接続と切断を行う事が違います。 (2)の場合、毎回接続と切断を行うので、2回ほどではあまり変わらないかもしれないのですが、もし10回とか接続と切断を行うとかなり負荷が高くなるような気がするのですが、他のHPなどを拝見すると接続をしたら切断を行うように癖をつけるようにした方がいいと書かれていたりします。 どちらの方が正しいやり方というか、負荷がすくなく使えるのでしょうか?

    • ベストアンサー
    • Perl
  • perlでdb(mysql)に接続

    perlでdb(mysql)に接続し、取得したデータを 表示させるというようなことをしたいのですが、うまく いきません。 ファイル名test.cgi mysqlのバージョンは 5.0.45で 記述は以下です。 #!/usr/bin/perl use DBI; my $dbh = DBI->connect("DBI:mysql:database, "userid", "password"); my $sth = $dbh->prepare('SELECT * FROM tablename'); $sth->execute; print "Content-Type: text/plain\n\n"; print "\n"; while(my @row = $sth->fetchrow_array) { print "$row[0]:$row[1]\n"; } $sth->finish(); $dbh->disconnect(); exit; ブラウザで確認すると何も表示されず、ログとして 以下のエラーが確認できます。 DBD::mysql::st execute failed: Table 'database.tablename' doesn't exist at test.cgi line 8. DBD::mysql::st fetchrow_array failed: fetch() without execute() at test.cgi line 11. my $sth = $dbh->prepare('SELECT * FROM tablename'); で指定したテーブルは存在しておりますし、SQL文の記述も 問題ないと思われます。 また、ファイルのパーミッションは705(755でも同様の結果)です。 perl初心者のため、どこが問題なのか検討がつきません。 ご助言いただきたく存じます。 よろしくお願いいたします!

    • ベストアンサー
    • Perl
  • SQLで別テーブルの参照

    こんにちは。 PostgreSQL+Perl+DBIでCGIを書いています。 テーブルからデータを取得する場合なのですが、table1にはIDのみが登録されていて、table2には、そのIDに対する文字列が登録されているとします。 このような場合に、tableからIDを取得して、そのIDに対するtable2の文字列を一気に取得することは可能でしょうか? つまり、 $dbh=DBI->connect(~); $sth=$dbi->prerare("SELECT id FROM table1 WHERE ~;"); $sth->excecute(); $id=$sth->fetchrow; $sth->finish(); $sth=$dbi->prerare("SELECT str FROM table2 WHERE id=$id;"); $sth->excecute(); $str=$sth->fetchrow; $sth->finish(); $dbh->disconnect(); といった処理をこんな感じに一度に行いたいのです。 $dbh=DBI->connect(~); $sth=$dbi->prerare("~~~~~;"); $sth->excecute(); $str=$sth->fetchrow; $sth->finish(); $dbh->disconnect(); 可能かどうかもわからないのですが、なにか良い方法はありますでしょうか?よろしくお願いします。

  • 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 フラグ」などのキーワードを知り調べてみましたが、具体的に自分の知識では解決できずに悩んでおります。 もし宜しければご教示頂けますと幸いです。 宜しくお願い申し上げます。

  • HTMLのソースを見ると文字化けしてる。普通の画面表示は問題ない。。。EUCなわけでもない。

    <head>で <meta http-equiv="content-type" content="text/html;charset=Shift_JIS"> と指定していて、IEのキャッシュもクリアして、 文字コードはshift_jisで書いてあるファイルで ソース上で <!-- ステータスバー文字列表示 --> と書いてあるコメントの文字列表示の「表示」の 部分がIEからソース表示すると文字化けしています。 これは何故なのでしょうか? その一部分のみです。 CGIなのですが、 CGIのうちのHTMLソースを吐き出しているところです。

    • ベストアンサー
    • HTML

専門家に質問してみよう