3

チャットシステムでUTF-8をサポートしようとしていますが、失敗します。クライアント側で、次のメッセージを送信した場合、パススルーされencodeURIComponentます。

  • îûôó

そしてこれをPHPの終わりに置きます:

error_log(print_r(array(
    $_POST['message'],
    urldecode($_POST['message']),
    rawurldecode($_POST['message']),
    utf8_decode($_POST['message']),
    utf8_decode(urldecode($_POST['message'])),
    utf8_decode(rawurldecode($_POST['message']))
), true));

これは私のエラーログの出力です:

Array
(
    [0] => %C3%AE%C3%BB%C3%B4%C3%B3
    [1] => îûôó
    [2] => îûôó
    [3] => %C3%AE%C3%BB%C3%B4%C3%B3
    [4] => îûôó
    [5] => îûôó
)

だから、すべてが大丈夫です。ただし、これらを使用する場合は、両方ともWikipediaからコピーされます(それぞれロシア語と日本語のページ)。

  • русскийязык
  • 日本語</li>

それはすべて地獄に行きます!

Array
(
    [0] => %D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9%20%D1%8F%D0%B7%D1%8B%D0%BA
    [1] => руÑÑкий Ñзык
    [2] => руÑÑкий Ñзык
    [3] => %D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9%20%D1%8F%D0%B7%D1%8B%D0%BA
    [4] => ??????? ????
    [5] => ??????? ????
)
Array
(
    [0] => %E6%97%A5%E6%9C%AC%E8%AA%9E
    [1] => 日本語
    [2] => 日本語
    [3] => %E6%97%A5%E6%9C%AC%E8%AA%9E
    [4] => ???
    [5] => ???
)

これを機能させるには何をする必要がありますか?

4

2 に答える 2

2

スタック全体でUTF8を実行します。

  • データベーステーブル
  • データベース接続
  • PHPのデフォルトの文字セット設定
  • 文字列関数

データベーステーブル:

db照合をに設定しutf8_unicode_ciます。
すべてのtext/varcharフィールドをに設定しますutf8_unicode_ci
次のクエリを実行して、データベース接続をUTF-8に設定します。

SET NAMES 'utf8'

PHP文字セット

使用する:

ini_set('default_charset', 'utf-8'); 

PHP文字列関数

一部のPHP文字列関数はバイナリセーフではないため、同等のmb_*を使用する必要があります。

例:mb_strlen代わりにstrlen

HTML:

メタタグを使用して文字セットを設定します。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
于 2011-11-01T17:15:00.967 に答える
2
$_POST['message'], => [0] => %C3%AE%C3%BB%C3%B4%C3%B3

入力をURLエンコードしすぎています。GET / POST / REQUESTスーパーグローバルは、必要に応じてURLデコード入力文字列をすでに処理しているため、手動でURLデコードする必要はありません。

このリクエスト(XMLHttpRequest?)の原因を調べて、への余分な呼び出しを削除しencodeURIComponent()ます。たとえば、jQueryを使用していajax()て、POSTデータをオブジェクトとして渡す場合、jQueryが呼び出しencodeURIComponent()を行うので、自分で行う必要はありません。

urldecode($_POST['message']), => îûôó

これは、Windowsコードページ1252(Western European、ISO-8859-1と同様)として誤って解釈されたUTF-8です。

ほとんどの場合、UTF-8バイトをログファイルに正常に保存しましたが、ログファイルを読み込んでいるものは、UTF-8としてレンダリングする必要があることを認識していません。

utf8_decode(urldecode($_POST['message'])), => îûôó

これは、テストに使用した文字がコードページ1252にも存在するためにのみ機能します。utf8_decode誤解を招くような名前が付けられています。実際には、UTF-8バイトシーケンスを同じ文字列を表すISO-8859-1バイトシーケンスに変換します。通常、ISO-8859-1ではなくUTF-8で作業したいので、一般的にutf8_decodeは避けてください。

русский язык => ??????? ????

理解できる:キリル文字はコードページ1252に存在しません。

error_log出力をファイルに送信し、ファイルを読み取ろうとしていると仮定して、プレーンなUTF-8バイトを使用し、エンコードを確認して選択できる適切なテキストエディターでログを読み取ります。理想的には、デフォルトでUTF-8に設定されている最新のものです。または、UTF-16またはUTF-8として保存し、先頭にバイト順マークを含めることで、メモ帳にUnicodeファイルを読み取るように指示することもできます。(UTF-8ファイルにBOMを含めるのはちょっと間違っていますが、Microsoftの世界の多くのツールがそれを行っています。)

于 2011-11-01T17:59:17.520 に答える