6

multipart/form-data がなくても、フォーム データを「multipart/form-data」として投稿しているときに、UTF-8 エンコーディングに問題があります。しかし、同じ投稿でファイルをアップロードする必要があるため、multipart/form-data を使用する必要があります。

問題は、PHP 5.3.x から PHP 5.4.4-14 (Debian Wheezy にバンドルされている) にアップグレードした後に発生し、同じスクリプトが PHP 5.3 テスト サーバーでうまく動作します。

  • ドキュメントはすべて UTF-8 で保存され、<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">タグが付いています。
  • さまざまなコンピューターのさまざまなブラウザーでテストしました
  • mb_detect_encoding() は投稿された文字列を UTF-8 として検出します
  • AddDefaultCharset utf-8私はApacheの設定を試みました。

ここで私のスクリプトをテストできます。次の文字列をトルコ文字でコピー/貼り付けできます (例: 文字列: öçşipğopüp )

http://sa.chelona.com.tr/haber-ekle.html

PHP でフォームが multipart/form-data として投稿されたときに、UTF-8 テキストが文字化けする関連の質問も見つかりましたが、apache/php の再インストールが推奨されており、それは私の状況では不可能です。これは既知の PHP/Apache バグですか?

4

11 に答える 11

5

UTF-8からトルコ語アルファベット ISO-8859-9への簡単な変換を行うと、問題は解決するはずです

iconv('UTF-8', "ISO-8859-9", $string);

入力例:öçşipğopüp

フォームの例:

<form method="post" enctype="multipart/form-data" action ="self.php">
<input type="text" name="hello" />
<input type="submit" name="test" />
</form>

シンプルサンプ:

var_dump($_POST['hello'],iconv('UTF-8', "ISO-8859-9", $_POST['hello']));

出力

string 'öçşipğopüp ' (length=16)
string 'öçþipðopüp ' (length=11)
于 2013-06-27T16:51:11.387 に答える
1

私のphpバージョンは5.4.45で、mbstring.http_inputからautoへの変更はpass非常にうまく機能します。php.iniファイルのデフォルト値は pass です。この変数の詳細については、こちらを参照してください。

于 2016-12-07T18:41:21.880 に答える
0

mb_internal_encoding("UTF-8");

このコードを文字列の前に追加します..

于 2014-02-24T14:21:49.933 に答える
0

小文字のように、PHP と HTML でヘッダーを追加する必要があります。

    <?php header('content-type: text/html; charset=utf-8'); ?>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
    <form method="post" enctype="multipart/form-data" action ="self.php">
        ...
    </form>
    </body>
    </html>

注意: すべての php および html ファイルを BOM なしの utf-8 で保存してください。

于 2013-07-03T13:46:25.370 に答える
0

unpack() とここでの回答からの提案を長い間試した後、落とし穴を見つけました。おそらく、エンコーディングの問題と同じ理由があります。

私がしなければならなかったのは、明示的に utf-8 を使用して htmlentities を作成することだけでした:

htmlentities(stripslashes(trim(rtrim($_POST['title']))), ENT_COMPAT, "utf-8");

これはphp 5.2.xx用です

于 2015-06-19T10:59:18.343 に答える
0

申し訳ありませんが、これは実際の解決策というよりも回避策のアイデアですが、従来の方法がすべて失敗し、何も再インストールできない場合は、UTF8 コード ポイントから変換してみてください。送信前に base64 エンコーディングを使用し、受信時にデコードするようなものです。または、16 進文字列に変換し、受信後にデコードします。

于 2013-07-02T23:49:35.527 に答える
0

この場合、エンコーディングを決定するために mb_detect_encoding を使用するべきではないと思います。

それを使用する必要がある場合は、UTF-8 がリストの上位にあることを確認するために検出順序を設定する必要があるかもしれません。http://www.php.net/manual/en/function.mb-detect-order を参照してください。 php

フォームの accept-charset を UTF-8 に設定しました。元のページを UTF-8 に設定しました: 現在のすべてのブラウザは UTF-8 を送信します。HTML 5 はこの FWIW を指定します: http://www.w3.org/TR/2011/WD-html5-20110405/association-of-controls-and-forms.html#multipart-form-data

文字列UTF-8 になります。変換を試みないでください。問題ありません。

しかし、PHPコードの一部を投稿すると、何をしようとしているのか、何が間違っているのかが明らかになるでしょう...

于 2013-07-01T17:03:16.897 に答える