1

私はデータベースに価格を保存するフォームを持っていますが、ユーザーが£記号を入力すると、Aの上に反射アクセントが付いたA£として表示されます(それらの1つを書く方法がわかりません)。phpmyadminに手動で入力すると、これは行われません。価格フィールドの連立はlatin1であり、varcharであるため、これに問題はありません。PHPのmysqlクエリでは、価格にhtmlspecialcharsとmysql_real_escape_stringがオンになっていますが、これらをオフにしても問題は解決しません。

最後に、£記号の表示方法が異なるだけでなく、実際にはデータベースへの保存方法も異なります。どうすればこれを修正できますか?

4

2 に答える 2

6

これは通常、接続の文字セットと文字列のユーザーが一致していないことが原因です。たとえば、接続文字セットが UTF-8 を返す可能性があり、PHP スクリプトが文字列を iso-latin-1 として扱う可能性があり、まさにこれが原因です。これらのプロパティが PHP でどのように設定されているかわかりません。

CLIでは、mysql次を使用してさまざまなプロパティを表示できますSHOW VARIABLES

mysql> show variables like '%char%';
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | latin1                                                  |
| character_set_connection | latin1                                                  |
| character_set_database   | latin1                                                  |
| character_set_filesystem | binary                                                  |
| character_set_results    | latin1                                                  |
| character_set_server     | latin1                                                  |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.0\share\charsets\ |
+--------------------------+---------------------------------------------------------+

私はその方向を見始めます。ここで示されているのは、単一の文字を期待しているときに、複数の文字が表示されているということです。7 ビット範囲外のものは、複数の UTF-8 オクテットにエンコードされます。

UTF-8 の詳細

  • "£" は iso-latin-1 コードポイントです0xA3
  • 0xA3UTF-8 を使用したエンコードの結果はバイトになります0xC20xA3
  • 0xC2iso-latin-1 グリフ "£"で0xA3表されます。
于 2012-06-20T12:10:27.957 に答える
3

アプリケーションの設計を変更して値と通貨を別々の列に格納すると、長期的には多くの苦痛を軽減できるでしょう。

value | currency
----------------
10    | GBP
16.42 | USD

次に、データベースに追加する前に、、、、またはのいずれ£10であるかに関係なく、ユーザー入力を解析し、データベースから取得するときに適切にフォーマットすることができます。10GBPTen Pounds Sterling

これにより、奇妙な通貨のサポート、通貨記号の変更への対応(はい、そうなります)、時間の経過に伴う為替レートの処理、およびWebサイト以外の場所へのデータの出力に関して、間違いなくあなたの生活が楽になります。

于 2012-06-20T12:13:40.443 に答える