• 締切済み

uri_escapeしない方法について

現在webページを作っているの者です。 (1)sjis設定のhtmlのformタグから(2)utf8で書かれたperlプログラムに送り、(3)その送られた文字をいったんDB(sjis設定のMySQL)に入れた後、(4)再びperlのプログラムでhtmlに吐き出すという、ごく普通のプログラムを書いています。 この際(2)のプログラムでuri_escapeし、(4)でuri_unescapeするという作業を行っています。 エスケープしないと文字化けてしまいます。 前にeucで書いたプログラムではいちいちこのような(escapeに関する)作業をせずともうまくいったのですが、今はこうしないとうまくいきません。 正直入力の度にエスケープするのは面倒なのですが、これを回避する方法はないでしょうか? サーバーはapache(ubuntu)です。 ご指南のほど宜しくお願い致します。

みんなの回答

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

mysql クライアントとしてのエンコーディングは プログラムのエンコーディングと一致していますか。 set names utf8 などの SQL 文で mysql クライアントの エンコーディングを指定できます。 また、データベースから取り出したデータの utf8 フラグは どうなっていますか。DBD::mysql を使っているのでしたら connect() のアトリビュートに mysql_enable_utf8 => 1 を セットすると、utf8 フラグ付きでデータが取り出せます。

keeeeeeeen
質問者

お礼

>t-okuraさん 解答ありがとうございます。 utf8に関して色々知らないことがありました。

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

関連するQ&A

  • MYSQL 4.1 の余計なエスケープ処理

    おはようございます。PERL 5.8.5 からMYSQL4.1 サーバーへのデータINSERT 時の文字変換処理について教えてください。 MYSQL 4.1 の文字コードは次の通りです。 SHOW VARIABLES LIKE 'character?_set?_%'; の結果 character_set_client :binary character_set_connection:binary character_set_database:utf8 character_set_results:binary character_set_server:utf8 character_set_system:utf8 MYSQL 4.1 サーバーが上記のような状態で、PERL で次の処理をします。なお、PERL ソース自体はEUC で書かれています。 #!/usr/bin/perl use Jcode; use DBI; $string = "あああ"; Jcode::convert( ?$string, 'utf8', 'euc' ); $dbh = DBI->connect( 'DBI:mysql:DB名:ホスト名:3306', 'ユーザー名', 'パスワード' ,{AutoCommit => 0} ); $sth = $dbh->prepare( "set names utf8" ); $sth->execute; $sth->finish; $sth = $dbh->prepare( "insert into test values( ? )" ); $sth->bind_param( 1, $string ); $sth->execute; $sth->finish; $dbh->commit; $dbh->disconnect; 上記のソースを実行すると、MYSQL 4.1 サーバーには [あ?あ?あ] のような、余計なエスケープが掛かった状態で文字がINSERT されているのです。 私としては、set names utf8 で、MYSQL 4.1 サーバーとクライアントで同様の文字コードを使うようにしているので、MYSQL 4.1 における余計な文字コード変換はないものと思っています。余計な文字コード変換がないにもかかわらずエスケープ文字が入る理由が分かりません。 この現象についてお分かりの方がいらっしゃいましたら教えて頂きたく思います。なお、ネットでも調べたのですが、どの方も未解決でしたので質問さえて頂きました。 お願いします。

  • ubuntuのようなutf8マシンでsjisを扱う方法について

    perlでwebページを作ってるんですが、ブラウザからサーバーにformで文字が遅れなくて困っています。 1.ブラウザで文字入力 2.perlで取得してsjisに変換。 3.MySQLにその文字列を登録。 ということをしようと思っているのですが、2の段階でsjisに変換できず困っています。 $a=Jcode::convert($a,"sjis","utf8") などと書いてみますがうまくいきません。 どなたかご指南頂けたら幸いです。

  • EUCのファイルを開くとUTF-8になる

    文字コードがEUCのperlで書かれたCGIをブラウザで表示すると、UTF-8となっています。(自動認識と設定していた場合) その場合は、文字化けしてしまいます。 ブラウザの文字コードをEUCに変更すると、文字化けせず表示されます。 perlプログラムは、EUCで書かれているのに、ブラウザでは(自動認識と設定していた場合)、UTF-8となる理由はどこにあるのでしょうか? perlプログラムでは、METAヘッダにEUC-JPと記述されています。 ちなみに、サーバのOSはCentOSです。(httpd.confでは、UTF-8が設定されています)

  • MySQL文字コード

    DB情報をHTMLで表示する場合に、mb_convert_encoding()で指定する文字コード MySQL5.1 PHP5 HTML - shift_jis MySQL の文字セット UTF-8 Unicode (utf8) MySQL の接続照合順序: ujis_japanese_ci フィールドの照合順序 ujis_japanese_ci PHPプログラムでDB情報取得後にSJISに変換 mb_convert_encoding($String, "SJIS", "●●●"); ●●●の文字コードを何を指定すればいいのかがわかりません。 EUCを書くとうまくいってるような気もしますが、なぜEUCでうまくいく のかもわかりません。 ご教授下さい。

    • 締切済み
    • PHP
  • 郵便番号csvのロードで特定の文字が化ける

    郵政省からダウンロードした郵便番号CSVをMySQLデータベースへ取り込む際に特定の文字が化けてしまいます。"十"という文字は確実に化けています。ソースのCSVはSJISに設定されており、データベースもSJISです。 いくつか下のような方法も試していますが、うまく行きませんでした。 ソースCSVをEUCに保存し直してアップロード時にSJISへ変換→駄目 ソースCSVをUTF8に保存し直してアップロード時にSJISへ変換→駄目 何か解決する方法はありませんでしょうか?ぜひよろしくお願いします。 環境としては、さくらインターネットのサーバで、phpMyAdminを通してLOAD DATA LOCALでロードしています。 FreeBSD 4.10-RELEASE-p20 i386 Apache/1.3.34 (Unix) phpMyAdmin 2.6.1-pl3 MySQL 4.0.26

    • ベストアンサー
    • MySQL
  • MySQL5.1の文字化け

    多くの方が同様の質問をされていたのですが、一致する問題が見つけれなかったので、ご存じの方がおられたら教えて下さいm(_ _)m (環境)  PHP 5.2.8 ZendFramework 1.5.1 から Pdo Mysqlを使用  文字コード:SJIS  Mysql 5.1  文字コード:EUC-JP (質問内容) 携帯の絵文字データをSJISのバイナリでスクリプト中に埋め込むため、スクリプトの文字コードをSJISに統一したところ、文字化けが発生しました。 SET NAMES SJIS のSQLを発行することで表示は正しくできるようなったのですが、新たにレコードを追加しようとすると文字化けが発生します。 例)情報 → 情表 insertを行う前の文字コードをSJIS,SJIS-win,EUCと変えてみましたが、SJISもしくはSJIS-winの場合は上記の例のとおりとなり、EUCにすると完全な文字化けとなりました... おそらく登録時にMYSQLがSJIS→UTF8→EUCに変換される時に正しく変換されていないものと思われるのですが、どなたか対処方法をご存じないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • Perlで変数中のエスケープされた特殊文字を展開

    Perlで、変数に既に格納されているエスケープされた特殊文字を、もとの文字に展開するには どのようにしたらよいでしょうか。 つまり、\t という値で格納されているのをタブ文字にしたり、\\ という値であれば\の一文字に するという事です。 ダブルクォートで定義すれば展開されると思いましたが、展開は変数の代入時に行われるだけで、 既に変数中にエスケープされて入っているものはダブルクォートを使い変数を囲んだりしても展開されません。 下記は簡単な例でやろうとしてる事を示したものです。 add変数に\tというタブを意味するエスケープされた特殊文字を含んでいるとして、その\tを タブとして展開し、abc defのようにさせたいのですが、abc\tdefと入ってしまいます。 $ cat unescape.pl #!/bin/perl $add = '\tdef'; #シングルクォートで代入すると、もちろんエスケープされたまま代入される #$add = "\tdef"; #ダブルクォートで代入すると代入時にタブへ展開される #$add = $ARGV[0]; #本当はAGRVからエスケープ特殊文字を含んだ文字列を取りたい。ARGVから代入すると、シングルクォートの時のようにそのまま代入される $tgt = 'abc'; print "add: " . $add , "\n"; print "before: " . $tgt . "\n"; $tgt .= "$add"; #既にエスケープされた形で代入されているものを、ダブルクォートで囲んで使っても展開されない print "after: " . $tgt . "\n"; $ perl unescape.pl add: \tdef before: abc after: abc\tdef

    • ベストアンサー
    • Perl
  • PHP+MySQLでSJISからEUCへの文字コード変換方法を教えてください。

    こんにちは。いつもお世話になっております。本来であれば自サーバーで検証してから質問すべきだとは思いますが、現在稼動中のサーバーしかなく、止めることができないので質問させていただきます。 現在、PHP+MySQLでサイトをSJISコードで運営しておりますが、「表」「能」等のSJISの文字化け対策が面倒になってきまして、EUCに変換してしまおうかと検討しております。 現状の日本語に関する設定は下記のようになっております。 ▼MySQL(my.cnf) バージョン:4.1.20 [mysqld] default-character-set=sjis init_connect="SET NAMES sjis" [mysql.server] default-character-set=sjis [mysqldump] default-character-set=sjis [mysql] default-character-set=sjis ▼PHP(php.ini) バージョン:4.3.9 mbstring.internal_encoding = SJIS mbstring.http_input = pass mbstring.http_output = SJIS mbstring.encoding_translation = On mbstring.detect_order = auto PHP内でMySQLと接続した直後に次のようにSJISを指定しています。 $sql="SET NAMES sjis"; mysql_query($sql); ちなみに、MySQLはMySQLadminで管理しておりますが、テーブルの照合順序は全てsjis_japanese_ciになっています。 上記のような内容ですが、この場合SJISからEUCに変換する場合の手順として、下記の流れでよろしいでしょうか? 1.PHPファイルをEUCコードに変換。 2.php.iniのSJISの部分をEUCに変換。 3.MySQLの設定ファイルのsjisの部分をujisに変換。 4.MySQLのテーブル内のデータを全てエクスポートして、外部エディタでEUCに変換後インポートする。 特に上記4の作業はテーブル数及びデータが膨大なため結構な作業になってしまいそうです。 もしもっと楽な方法があればご教授いただければ幸いです。なお、サーバーはRed Hat Enterprise Linuxです。

    • ベストアンサー
    • PHP
  • PHPでUTF-8からEUC-JPにエンコディングしたときに、一部の文

    PHPでUTF-8からEUC-JPにエンコディングしたときに、一部の文字が文字化けしてしまいます。(1)という文字です。データベースをEUCで作っていて、すでに色々なデータが入っているので、データベースをUTF-8とするわけにもいかないでの、なんとかEUCで保存しようとしているのですが・・・。 "テスト(1)"(UTF-8)をmb_convert_encodingでEUCにして、保存しますと、"テスト?"となっています。 テスト(1)をUTF-8の状態でブラウザで確認しますと、文字化けしないできちんと「テスト(1)」と表示されます。やはり、Mysqlに保存するときに文字化けしています。どなたか、似たような経験のある方がおりその原因がお分かりでしたら、教えてください。SJISにあるようなダメ文字というものなのでしょうか。確か「まぐまぐ」というメルマガの編集でも(1)という文字は使えませんでした。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPからInsertしたら文字化けしてしまいました。

    Apache2,PHP5,MySQL5を使用しています。 PHPからMysqlにデータを格納し、その後MySQLからデータを受け取りPHPで表示させると、PHPでは問題なく表示されていたのですが、MySQLでは文字化けしてしまいました。 送った内容は、「こんにちは。沢田です」と送りました。 PHPでは「こんにちは。沢田です。」となっていたのですが、MySQLには「??"??"???????????¢?" ??§??」となって格納されていました。 PHPではutf8でsjisにして設定しています。何がいけないのでしょうか。 よろしくお願いします。

MFC-J6995CDW 色が出ない
このQ&Aのポイント
  • 洗浄液でヘッドクリーニング繰り返すも色が出ません。目詰まり以外に原因がありますか?
  • お使いのパソコンはWindows10で、接続は無線LANです。関連するソフト・アプリはありません。電話回線はひかり回線です。
  • MFC-J6995CDWの色が出ないトラブルについて、目詰まり以外の原因や解決方法を教えてください。
回答を見る