0

xmlhttpreqeust を使用したフォーム送信メソッドを実装しました。フォームと一緒にファイルを送信できる新しい html5 機能、FormData を見ました。涼しい!ただし、アクセント付きの文字、特に Word が作成するばかげたスマート クォートには問題があります (そうです、私はこれらの文字に対して少し偏見があります)。昔ながらの方法で隠し iframe に送信していましたが、そこに置かれたさまざまな奇妙な文字に問題はありませんでした。でも、これでいいのかなと思いました。それはより大きな頭痛の種であることが判明しています:-/

コードを見てみましょう。私のJavaScript関数(コメントアウトされた行に注意してください):

var xhr = new XMLHttpRequest();
var fd = new FormData(form);

xhr.addEventListener("error", uploadFailed, false);
xhr.addEventListener("abort", uploadCanceled, false);
xhr.addEventListener("load", uploadComplete, false); 

xhr.open($(form).attr('method'), $(form).attr('action'));

//xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=ISO-8859-1");
xhr.send(fd);

これは短縮されたビューです。関数全体を表示するには、http://archive.cyark.org/sitemanager/sitemanager.jsの行 1510 をチェックしてください。

次に、受信 php ページの上部に次のように表示されます。

header('Content-Type: text/html; charset=ISO-8859-1'); 

続いて、いくつかの基本的な php を実行して、投稿データで文字列を作成し、それを更新として mysql に送信します。

それで、私は何をしますか?javascript の content-type 設定のコメントを外すと、php スクリプトの POST データが完全に壊れてしまいます。問題が javascript にあるのか、php にあるのか、mysql にあるのかわかりません。何かご意見は?

4

1 に答える 1

2

エンコーディングの問題は、デバッグが難しい場合があります。要するに、最善の解決策は文字どおりどこでもエンコーディングとして UTF8 を使用することです。つまり、アプリケーション スタックのすべてのコンポーネントです

あなたのページは ISO-LATIN-1 (Web サーバーから HTTP ヘッダー経由で送信される) として配信されているようです。これにより、HTML の HEAD に META 要素があり、ユーザー エージェントにUTF8 を使用します。HTTP ヘッダーが優先されます。他のファイル形式 (特に .js) の配信も UTF8 であることを確認してください。クライアント側関連 (HTML、JS、XHR など) をすべて UTF8 を使用するように構成した後も問題が発生する場合は、サーバー側の問題をチェックする必要があります。

これには、PHP ファイルが適切な UTF8 ではないなどの単純な問題が含まれる場合がありますが (Linux サーバーではほとんどありません)、通常は mysql の構成 (サーバーとクライアント)、データベースとテーブルのデフォルトのエンコーディング (および照合) および正しい接続設定。問題は、不適切な PHP ini または mbstring 構成設定によって引き起こされることもあります。

例 (完全ではありません。ここでは一般的なデータベースの例として mysql を使用しています):

MySQL 構成

[mysqld]
default_character_set = utf8
character_set_client = utf8
character_set_server  = utf8
[client]
default_character_set = utf8

これらの設定は mysql バージョン 5.1 と 5.5 で異なり、間違った変数を使用すると mysqld が起動しない可能性があることに注意してください。http://dev.mysql.com/doc/refman//5.5/en/server-system-variables.htmlおよびhttp://dev.mysql.com/doc/refman/5.1/en/server-system-を参照してください。詳細については、 variables.htmlを参照してください。

CLI 経由で mysql 変数を確認できます。

mysql> SHOW VARIABLES LIKE '%char%';
Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server utf8
character_set_system utf8

データベースとテーブルを作成するときは、次のようなものを使用してみてください

CREATE DATABASE $db /*!40100 DEFAULT CHARACTER SET utf8 */

PHP.ini 設定 (既にデフォルトになっているはずです):

default_charset = "utf-8"

PHP の MB-String 拡張機能はデフォルトで latin1 を使用し、使用する場合は再構成する必要があります。

[mbstring]
mbstring.internal_encoding = UTF-8
mbstring.http_output = UTF-8
...some more perhaps...

Web サーバーの設定 (例として使用されている Apache は、他のサーバーにも適用されます):

# httpd.conf
AddDefaultCharset UTF-8

PHP ソース コードでは、次のようなヘッダー設定を使用できます。

header('Content-type: text/html; charset=UTF-8');

シェル (bash) 設定:

# ~/.profile
export LC_CTYPE=en_US.UTF-8
export LANG=en_US.UF-8

上記のリストは、特定の状況でどのような落とし穴が待ち受けているかについてのヒントを提供するためにここに提示されています. 使用する Web スタックのすべてのコンポーネントは、UTF8 を使用できる必要があり、そのように正しく構成する必要があります。それにもかかわらず、通常、UTF8 の単純で正しい HTTP ヘッダーで、ほとんどの問題を解決するのに十分です。幸運を!:-)

于 2012-07-24T22:52:39.107 に答える