マンガでよめる痔のこと・薬のこと

機種依存文字「○いち」「(株)」の文字化けがどうしても解消できません。
phpソースに機種依存文字をコーディングした場合には正しく表示されますが、外部より入力した文字をMySQLに格納し、phpにてデータを取り出し表示すると文字化けします(phpmyadminでの表示時点で文字化け)。
「mb_convert_encoding」等にてテストしてみましたが、結果は変わりませんでした。また、phpmyadminにて直接MySQLに入力しても、phpmyadminでもブラウザ(php表示)でも文字化けしてしまいます。

文字コードについて知識が浅く、各環境はデフォルト状態です。
「mbstring.internal_encoding = EUC-JP 」にも関わらず、「character_set_client = utf8」「character_set_results = utf8」としているのに、機種依存文字以外は問題無く表示されております。

1.機種依存文字化けの対応方法
2.正しい環境設定方法(文字コードの統一を行うべき等)
ご教授のほど、何卒宜しくお願い致します。

<<環境>>
・windows xp
・UNIX socket 4.1.22
・phpMyAdmin - 2.11.1
・Mysql 4.1.21
・PHP 4.4.7

【Mysql】
character_set_client = utf8
character_set_connection = utf8
character_set_database = utf8
character_set_results = utf8
character_set_server = ujis
character_set_system = utf8

【my.cnf】
[client]
default-character-set = ujis
[mysqld]
default-character-set = ujis
[mysqldump]
default-character-set = ujis

【php.ini】
mbstring.language = Japanese
mbstring.encoding_translation = On
mbstring.http_input = auto
mbstring.http_output = EUC-JP
mbstring.internal_encoding = EUC-JP
mbstring.detect_order = auto
mbstring.substitute_character = none;
※phpソースには「charset=euc-jp」を記載

このQ&Aに関連する最新のQ&A

A 回答 (1件)

その前に、あなたが作ろうとしているサイトは機種依存文字を許しているのでしょうか?


不特定多数のOSやブラウザから参照されることを考えると、機種依存文字を許すべきではない。また、機種依存文字をどうにか変換する(このサイトのように)という処理が必要では?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

サイトでの機種依存文字の使用は認めておりませんが、とはいえ、やはり機種依存文字を使うクライアントがいるのも事実でございます。運用で完全に対応できるのであれば、そうしたいのですが、なかなか。。。

機種依存文字を判定する関数を新規作成し、データベース登録時に新規作成関数にて「機種依存文字を似ている文字に変換(「かっこ株」を「半角かっこ、全角”株”」に変換)し、登録するようなことで対応しようかと考えております。機種依存文字の判定をどうするか、考える必要がありますが。。。
機種依存文字はこう扱うべき(入力チェックでそもそも入力させない、データベース登録時に変換するなど)などのご意見がございましたら、是非ともお聞かせいただきたく思います。

機種依存文字が化けるということは、私が長々と記載した設定ファイル等の登録内容は全く関係がなかったということみたいですね。

的外れな質問にご回答いただき、誠にありがとうございました。

お礼日時:2008/03/10 15:45

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QMySQLの文字化け

WindowsServerでPHPとMySQLで作成したプログラムを動かしています。
PHPからINSERTでMySQLに登録すると環境依存文字(「(株)・(有)など)が「?」になってしまいます。
PHPからSELECTでブラウザ上に表示させると文字化けはしていませんが、phpMyAdminで確認すると「?」になっています。

このデータベースの内容を他のサーバーに移すときに、phpMyAdminからエクスポートまたはmysqldumpすると「?」のままエクスポートして、他のサーバーでインポートしても当然「?」になってしまいます。

環境依存文字が文字化けしない、あるいは他のサーバーでも環境依存文字をそのまま移行できるようにはできないでしょうか。

よろしくお願いします。


PHPはEUC-JP、データベースはujisで作成しています。
INSERTの直前でSET NAMES UJISを実行しています。

Aベストアンサー

mysqldumpのオプションに--default-character-set=ujisを指定するとどうですか?
もともとの作成データベースはeucjpmsのほうがいいようですが。

Q機種依存文字

機種依存文字を排除したいのですが、PHPでどのように書けばいいのか検討がつきません。

また、DB(Postgres)で検索のときに、排除できるのならばいいのですが、そのような検索方法はないですよね?

Aベストアンサー

#1です。

機種依存文字は、
http://www.shtml.jp/mojibake/izon_check.html
より、
 ・13区の特殊文字(0x8740~0x879F 83文字)
 ・NEC選定IBM拡張文字(0xED40~0xEEFC 374文字)
 ・IBM拡張文字(0xFA40~0xFC4B 388文字)
 ・外字(0xF040~0xF9FC)
ということで、
|[\x85-\x88][\x40-\x9E]|[\xEA-\xFC][\xA5-\xFC]
が不要そうですね。

Qリンクをクリックした時にformからPOST送信したい。

HTML、PHP、JavaScript等でサイトを作っているのですが・・・。

【実現出来ている例】
<form name="form1" method="post" action="Next.php" onSubmit="return InputCheck()">
 <input type="submit" value="送信">
</form>
 submitボタンを一つ置いて、それがクリックされた場合に
formの内容をPOSTで送信する。

【実現したい例】
<form name="form1 method="post">
 <a href="Next.php" onClick="???">???</a>
</form>
 formの中のリンクをクリックされた場合に、formの内容を
POSTで送信したいのですが、その実現方法がわかりません。
GETで送るという手もあり得ますが、今回はどうしてもPOST
したいのですが。

Aベストアンサー

<form name="form1" method="post" action="Next.php">
<a href="#" onClick="document.form1.submit();">???</a>
</form>

onclick内の対象がform1としてあてているので、
アンカータグは別にform内に記述しなくても大丈夫です

form内にhidden等でnameとvalueを持ったパラメータがあればそれも送られます

アンカータグから動的にvalueを変更したい場合は、
document.form1.hogename.value = 'hoge';
等をsubmit()の前に行えば可能です

ただしform内に
<input type="hidden" name="hogename" value="">
を記述する等、変更先パラメータの元を用意する必要がありますのでご注意下さい

Qテーブルの最後(最新)のレコードを抽出したい

宜しくお願いします。
PHP MYSQL の組み合わせで使っています

以下のようにして、最後のレコードを取り出したいのですが
まったく違う事をしているのかもしれません。

$sql =" select * from テーブル where フィールド='max' " ;

フィールドはauto_incrementで番号を振っています。
これで最大のつもりなのですが・・・。

他にも、レコードを入れた時間も記録したフィールドがあるのですが
どうしてよいか?判りません。

テーブルの最新のレコードを出したいのです。
**その中の一つのフィールドを取り出すのですが、
  それはうまくいっているみたいです 
  (max の所に数字を入れると表示します)

お手数かけますが、どなたかご教授お願いいたします。

Aベストアンサー

#2回答者です。

MySQL 4.1以前(サブクエリを使えない)なら、以下のような方法が考えられます。

select * from 表名
order by 列名 desc limit 1

QCSSでボックス幅を文字列に合わせたい

ボックス幅を文字列の幅に合わせるにはどうしたらいいのでしょうか。
テーブルではセルにwidth属性を指定しなくても文字列の幅になりますが、ボックスではwidthプロパティを指定しなかったら領域全体の幅になります。white-spaceプロパティでnowrap指定し、widthプロパティで文字列より小さいサイズに指定するとできるのですが、他に指定する方法があれば教えて下さい。

Aベストアンサー

div等のblock要素ではなくspan等のinline要素によって行う。

<span style="border:solid 1px">文字幅に合わせた枠線</span>

QERROR1062:Duplicate entry.....というエラーが出てしまいました

いつもお世話になります。
データベースからSELECTで抽出したデータを別のテーブルにINSERTするSQLを実行したのですが、
ERROR1062:Duplicate entry.....というエラーが出てしまいました。
お詳しい方がいらっしゃいましたら、アドバイスをいただけませんでしょうか?よろしくお願いいたします。
【実行したSQL】
INSERT INTO tblA (dataA1, dataA2, dataA3, dataA4) SELECT "9001","AA",dataB1,dataB2 FROM tblB WHERE dataB1 = 52

tblAの主キー:dataA1とdataA2
tblBの主キー:dataB1

dataA1とdataA2はtblAの主キーとなっているため、重複してしまうということのようです。tblBの主キーはdataB1であるため、抽出されてくるデータは常に1件なので問題ないと期待していましたが、甘くなかったようです。何か良い方法はないものでしょうか?よろしくお願いいたします。

Aベストアンサー

「ERROR 1062」は、重複データを格納しようとした場合に出力されるエラーです。
既にdataA1='9001'&dataA2='AA'という行が、tblAに格納されているのですよね?

>抽出されてくるデータは常に1件なので問題ないと期待していました

「insert ~ select ~」を実行前に、既に同じデータが格納されているのでは?
あるいはprimary keyの指定が、質問中に記された通りでなく、2件以上検索されているかです。

>何か良い方法はないものでしょうか?

何をするための方法を、聞きたいのかが分かりませんが?

QMySQL4.1以上で、機種依存文字、特殊文字を扱うにはどうしたらよいの?

クライアントの文字コードをsjisにした状態で
aというテーブルに、機種依存文字「キロ」を以下のようなクエリでいれようとした場合。

insert into a values("キロ") ;


サーバ側の文字コードがUTF-8では、以下のようなエラーが出てインサートできません。

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near '"?")'
at line 1


サーバ側の文字コードをsjisにした場合は、上記のようなエラーは出ずにインサートできるのですが、文字化けします。
機種依存文字、特殊文字をデータベースで扱うにはどうするのが一般的なのでしょうか?

Aベストアンサー

私はPHPもSQLも勉強し始めてまだ数ヶ月です。
この為、SQLの常識をよく判らず、UTF-8で作ったデータベースにSJISのデータを格納した結果ソートが変になる等の不具合が発生した経験があるのですが…

前置きが長くなりましたが、その際に(文字コードの問題と気づかないまま)解決する為に取った手段が流用出来そうなので紹介します。

・URLエンコードして、エンコードをデータベースに格納する。

つまり、「あ」という文字をデータベースに入れるのではなく、『%82%a0』とコード化した文字列をデータベースに入れます。

利点:
・PHPの文字コードだけ意識すれば操作できる。(=DBの文字コードを無視出来る)
・特殊文字や機種依存文字も %+16進数 で表すので問題なく利用出来る。
・ユーザー入力を格納する場合でも、エンコードしてからデータベースに渡すので、セキュリティ上優位。

欠点:
・全ての操作において一々エンコード・デコードが必要になる。
・データが3倍の6バイト(SJISの場合)になる。

と、サーバーの負担が増加しますが、小規模のデータベースなら活用出来ると思います。

なお、最初に書いたようにPHP・SQLとも勉強を始めて数ヶ月(かつ独学+教材=ウェブ)ですので、一般的な方法は分かりません(^^;

私はPHPもSQLも勉強し始めてまだ数ヶ月です。
この為、SQLの常識をよく判らず、UTF-8で作ったデータベースにSJISのデータを格納した結果ソートが変になる等の不具合が発生した経験があるのですが…

前置きが長くなりましたが、その際に(文字コードの問題と気づかないまま)解決する為に取った手段が流用出来そうなので紹介します。

・URLエンコードして、エンコードをデータベースに格納する。

つまり、「あ」という文字をデータベースに入れるのではなく、『%82%a0』とコード化した文字列...続きを読む

Qmysql複数レコードをまとめて削除ってできますか?

php、mysqlを勉強しております。

phpを使って、mysqlの複数レコードをまとめて削除する方法を探しています。

※テーブル名[sample]
ID NAME
1  ABC
2  BCD
3  CDE
4  DEF
5  EFG

このようなテーブルがあるとして、IDの2、3、5を削除したいと考えています。
その場合、下記のように3回、クエリを実行しなければいけないのでしょうか。

DELETE FROM sample WHERE ID = 2
DELETE FROM sample WHERE ID = 3
DELETE FROM sample WHERE ID = 5

詳しい方がいらっしゃいましたら、ご教授いただけないでしょうか。
よろしくお願い致します。

Aベストアンサー

DELETE FROM sample WHERE ID IN ( 2,3,5)


人気Q&Aランキング