• ベストアンサー

SJISのダメ字について

php4、postgres8でデータベース登録をしています。 server_encoding、client_encoding共に SQL_ASCIIです。 フォームから受け取った文字列をDBに書き込むと 特定文字だけ文字化けします。 ダメ字といわれる文字です。 文字化けしないようにINSERTするには どうしたらよろしいのでしょうか?

  • PHP
  • 回答数4
  • ありがとう数2

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

  • ベストアンサー
回答No.3

PHPは内部処理にSJISは使えません。SJISの【表】【予】【ソ】にはaddslashesでエスケープすべき文字が含まれているって判断されてしまうので"\"が付いちゃうんです。だからmbstring.internal_encodingの値はEUC-JPなどにして、フォームからの文字列はEUC-JPに変換してから内部処理してあげないといけないんです。表示をSJISで行うなら、出力時に再度SJISに変換する必要があります。php.iniの設定によって、このあたりの文字コード変換を自動で行う事もできます。参考URLを見て下さい。

参考URL:
http://www.php.net/manual/ja/ref.mbstring.php
rabu_chihaha
質問者

お礼

ありがとうございます。 参考にします。

その他の回答 (3)

回答No.4

補足です。 「文字コード変換を自動で行う事もできる」と書きましたが、PHPで日本語を扱う限り文字コードの問題は当面付いて回るので、それをしっかり理解するためにも入力、内部処理、出力、それぞれ箇所でどういう文字コードなのかをきちんと認識して、自動変換は行わず、意識して文字コードの変換を行う事をオススメします。 ちなみに日本語処理はある意味お約束のルーチンワークですから、使いまわしのできる形でサブルーチン化しておくと後々楽ですよ。

回答No.2

私も、ダメ字というのは、初めて見聞きしました。 とはいえ、確かな名称は思いつかないですねー。 sjis文字化け文字、だと長いし。 postgres8は分からないのですが、文字コードですが、 EUCじゃダメなんですか? 私は基本的にEUCにして、再度確認してるんですが。 どちらにしても、一度EUCにコンバートしないと ダメみたいですねー。 http://www.roje.co.jp/blog/blog.php?mode=MsgList&id=b_1_

参考URL:
http://www.roje.co.jp/blog/blog.php?mode=MsgList&id=b_1_
rabu_chihaha
質問者

お礼

あいがとうございます。 本当はEUCにしたいのですが・・・ ある事情があって出来ないのです。

  • yoneda_16
  • ベストアンサー率47% (166/350)
回答No.1

「ダメ字といわれる文字」とはなんでしょうか。「ダメ字」という表現ははじめて聞きました。Googleで調べたかぎりでは「ダメ字」というフォントの情報ばかりで、当該問題とは関係ないように思えます。 具体的にどういう記号だとか漢字だとかが「ダメ字」と呼ばれているのか、できればどこでそのように呼ばれているのか教えてください。

rabu_chihaha
質問者

補足

【表】【予】【ソ】などの文字です。 [¥]エスケープシーケンスの5Cの問題らしいのですが。 検索したら、ダメ字という表現をされていたからです。

関連するQ&A

  • sjisでのあいまい検索を教えてください

    Postgres8です。 データベースのエンコーディングは【SQL_ASCII】です。 LIKE検索をした場合のSJISの文字化けに対する対処方法を教えてください あいまい検索をしたいのですが、 文字化け対象文字を含む場合、 どのように記述すればいいのですか? select * from aaa where name = 'パソ\コン'; 上記のように完全一致で検索をすると抽出できます。 select * from aaa where name like '%パソ%' 上記のよう指定してlike検索をしても抽出できます。 しかし以下の場合どちらでも抽出できません。 select * from aaa where name like '%パソコ%' select * from aaa where name like '%パソ\コ%' よろしくお願い致します。

  • SJISからUTFに変換してのDB登録がある文字だけうまくいかない。

    PHPとPostgresでデータベース構築中の初心者です。宜しく御願いします。 今現在なんとかSJIS(windows)からUTF(linux)へ文字コードを変換してDBへデータを入力できるようになり、テスト中なのですが、問題が発生しました。 データがある文字で終わる場合のみデータ追加ができない、という問題です。 今分かっているのは、「表」という文字です。 しかも、文字列の最後に来た場合のみエラー(SQLでINSERTできない)がでます。 例えば、「方針発表」と入力した場合、エラーですが、 「方針発表出席」と入力すればデータ追加可能です。 いろいろ調べている途中ですが原因、解決策ともにまだ不明です。 どなたか御教授願います。 ちなみに、文字コード変換は次の関数cnvで行っております。 function cnv($string, $enc){ $det_enc = mb_detect_encoding($string, "UTF8, SJIS"); if ($det_enc and $det_enc != $enc){ return mb_convert_encoding($string, $enc, $det_enc); }else{ return $string; }}

    • ベストアンサー
    • PHP
  • データ移行時の文字化け

    テキストファイルに保存していたログデータをPostgreSQLデータベース(文字コード:SQL_ASCII)に保存すると、文字化けが発生します。 移行処理でのSQL文字列の段階では問題ないのですが、実際に保存されたデータは文字化けした内容になっています。(「\」がついた状態) stripslashes関数を使ってみましたが、SQL文字列の段階で文字化けしてしまい、そのまま登録されてしまいます。 どなたかご回答よろしくお願いします。

    • 締切済み
    • PHP
  • FFFTPでの、ファイル名の日本語化について

    (1)PHPで、fopen($filename, 'c+')などして、自動的に、口コミ投稿ファイルなどの ファイルを作成する際に、投稿者名の漢字をそのままファイル名などにすると、 必ず文字化けしてしまいます。どうすれば、FFFTP内部で日本語のファイル名に できるでしょうか。 (2)MySQLクライアントを使って、レンタルサーバー上のデータベースを扱う際に、 INSERTしたデータが、文字化けして困っています。レンタルサーバー会社に聞くと、 サーバー側の文字セットに合わせておけばいいということでしたが、サーバー側で、 utf8-general-ci を使っているらしく、クライアント側でも、照合順序をutf8-general-ciに しまして、 mysql_set_charset("utf-8"); $sql = "SET NAMES utf-8"; mysql_query($sql); と書いたあとで、INSERT文を使っても、phpMyAdmin上で文字化けしております。 PHPスクリプト内に、あと何を書けば、文字化けしないで済むのでしょうか。 (ちなみに/* 内部文字エンコーディングをUTF-8に設定 */ mb_internal_encoding("UTF-8"); という文章も必要でしょうか。) どうかよろしくお願いします。

  • PHPからデータベースへの登録について

    はじめまして。現在、仕事の関係でPHPのプログラムを勉強している者です。 早速ですが、質問させていただきます。 PHPで作成したフォームメールから別で用意したデータベースに 入力データを登録しようとしているのですが、エラーでうまく動作しません。 PHP側のコードミスもあるかもしれませんが、PHPを動作させているサーバーと データベースサーバーの文字コードが違う点も原因しているのでは?と調べている状況です。 フォームからのデータを送るPHP ⇒ Shift_jis PHPをアップしているWebサーバー ⇒ Shift_jis データベースサーバー ⇒ EUC-JP データベースへの接続は問題なく行えているようですので、 登録処理するコードの部分のみを書きます。(↓) ******************************************************************************** // データベースへの登録 $sql = "INSERT INTO FORM_DATA(DataNumber, Time, Name, Email, Area, Sex, Interest, Commnet, OS, IP) VALUES('$tsvcount', '$ymdhis', '$sender_name', '$mail_address', '$mail_area', '$mail_sex', '$mail_interest', '$mail_body', '$os', '$ip')"; $sql = mb_convert_encoding($sql, 'EUC-JP', 'sjis'); mysql_query("SET NAMES 'EUC-JP'"); $db_result = mysql_query($sql); print $sql; print $db_result; if (!$db_result) { exit('Error! データを登録できませんでした。'); } // データベースとの接続解除 $db = mysql_close($db); if (!$db) { exit('データベースとの接続を閉じれませんでした。'); } **************************************************************************** PHP&Webサーバーとデータベースの文字コードを統一すればいい話かもしれませんが、 事情により異なる文字コードの環境で開発しております。 上記の通り、データベースに送信するSQL文はmb_convert_encoding()で「EUC-JP」に変換し、 mysql_query($sql);でデータベースに送信している形です。 この状態で送信すると、エラーとなり送ったSQL文を処理してくれません。 文字コードの変換処理、コードの記述など何が原因なのか分からず困っています。 考えられる原因と、解決策があればご教授いただきたいです。 ちなみに私はPHPはもちろんプログラム自体もまだ経験が浅く、 基礎的なことも理解していないことがかなりあります。 その上でご説明いただけますと大変有難いです。 ではよろしくお願い致します。

    • 締切済み
    • PHP
  • SJIS→EUCに送っても文字化けしない

    htmlは、SJISで作っています。 PHPは、EUCで作っています。 普通は文字化けをするため、mb_convert_encoding関数を用いますが、 なぜか、この関数を使わなくても、文字化けしません。 友人は、有り得ないと言います。 事実、友人PCではmb_convert_encoding関数で文字化けを直してました。 私も友人に同感で、SJIS→SJISやEUC→EUCなら文字化けしないけど、文字コードが違うのです。違うから、mb_convert_encoding関数を使うと、思っているのですが‥‥ 設定が違うのかと思い、友人の、php.iniなどいくつかのファイルを私のPCに上書きしてもらいましたが、変わりませんでした。 こういうことってあるのでしょうか? 文字化けしないなら、mb_convert_encoding関数を使わなくて良いので、楽だと思いましたが・・・ 何かの不具合なら、いざ完成した時、またmb_convert_encoding関数をいれる手間がありますし、どうしようか迷っています。 本には、「文字化けしない場合もある」という記述は一言も書いてありませんでした。 逆に、「文字化けするからmb_convert_encoding関数を用いる」と大きく書いてあるぐらいです。 何かの設定なのでしょうか? ソフトのバージョンも、同じでした。不思議です。

    • ベストアンサー
    • PHP
  • postgresのパスワードの変更?

    PHP+PostgreSQLで開発しているのですが、PostgreSQLのパスワードがわかりません。 まず、PostgreSQLのユーザー(postgres)を作成して、パスワードも設定しinitdbでデータベースを初期化しDBを作っていました。 そしてそのDBを作っていた人が突然夜逃げしてしまったのでpostgresのパスワードがわからなくなってしまい、そこでroot権限でパスワードをpasswdコマンドで変更したのですがDBにpostgresでアクセスできません。 [admin admin]$ su - postgres Password: [postgres pgsql]$ psql -d test Password:←ここでは新たに変更したパスワードを入力しました psql: FATAL 1: Password authentication failed for user "postgres" となります。initdb後にpostgresのパスワードを変更した場合は前に設定されていたパスワードを入力しなければならないのでしょうか? またパスワードを調べる手立てはないでしょうか? List of databases Name | Owner | Encoding -----------+----------+----------- test | postgres | SQL_ASCII template0 | postgres | SQL_ASCII template1 | postgres | SQL_ASCII DBの中はこのようになっています。 宜しくお願いします。

  • 複数の文字コードの混在

    お世話になります。 今、日本語と広東語が混在しているページを作っているのですが、どうしても文字化けが解消しないので相談させてください。 私の浅はかな知識では、複数の文字コードが混在する場合は、UTF-8で構築してやれば混在は可能と認識していたのですが、間違いないでしょうか。 ユーザーがPHP経由でPostgresにデータをPOSTし、その一覧をPHPで表示するだけの流れで、ブラウザで表示するのもページの構築自体もUTF-8で行っています。 PHPからinsert文を実行する際に、mb_convert_encodingを使わないで広東語を入力すると pg_exec(): Query failed: ERROR: Unicode characters greater than or equal to 0x10000 are not supported とエラーが表示されます。 しかし、mb_convert_encodingを通したあとのデータはすでに文字化けしており、結果もそのまま文字化けしてしまいます。 Postgresを使わずに、テキストに書き込みをした際には混在は可能でしたので、Postgresの問題かと思い、質問させて頂きました。 ちなみにデータベースのエンコードはUNICODEにしてあります。 ご指摘、助言等何でも構いませんのでよろしくお願いいたします。

  • PHPのSJISからUTF-8への変換で文字化け

    いつもお世話になります。 PC用システムがあり、一部データを携帯電話からも更新したいと思い、既に稼働しているUTF-8のシステムに機能追加しています。 携帯はSJISのみとの事ですので、SJISで携帯用サイトを作成し、DBからデータの読込、表示など問題なくできるようになりました。 携帯サイトでHTMLフォームを作成しており、そこからDBへ書き込む際に、判る範囲ですが以下の文字が文字化けして登録されてしまいます。。 予→浴 ソ→メ 他にも文字化けしそうな感じなのですが、なぜ上記の特定文字だけ文字化けするのでしょうか・・・? 例えば 大阪 東京 名古屋 アップル などは一切文字化けせず問題ありません。 PHP自体はSJISで作成しており、DB登録時にmb_convert_encoding($txt,"UTF-8","SJIS")でUTF-8としています。 どなたかお詳しい方、ご教授のほど宜しくお願い致します<(_ _)>

    • ベストアンサー
    • PHP
  • SJIS→UTF-8変換後の文字化けについて

    EXCELで作ったテキストデータ(SJIS)をPHPで読み込んでUTF-8でDBへ書き込むという処理をしたいのですが、一部どうしても文字化けしてしまう文字("l(リットル)"と"II")があり困っています。 具体的には、data.dat(SJIS)を、 hoge.php(UTF-8)で、 $data = mb_convert_encoding(file_get_contents("data.dat"),"UTF-8","auto"); というようにしています。 テキストデータはSJIS、DBへはUTF-8というのは変えられません。 なにかよい方法はないでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう