質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.61%

multipart/form-data でPOST した際の文字化け

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 9,716
退会済みユーザー

退会済みユーザー

前提・実現したいこと

PHP7(Laravel5.2)で画像ファイルのアップロードと日本語テキストをPOSTしています。
コントローラでリクエストの中の文字列を取得したところ文字化けしているので、対処方法・確認項目を教えていただきたいです。

発生している問題・エラーメッセージ

送信したテキストが文字化け(良かった点の追加)しています。

mb_get_info()の結果は

{
    internal_encoding: "UTF-8",
    http_input: "ASCII",
    http_output: "UTF-8",
    http_output_conv_mimetypes: "^(text/|application/xhtml\+xml)",
    func_overload: 0,
    func_overload_list: "no overload",
    mail_charset: "ISO-2022-JP",
    mail_header_encoding: "BASE64",
    mail_body_encoding: "7bit",
    illegal_chars: 0,
    encoding_translation: "On",
    language: "Japanese",
    detect_order: [
        "UTF-8",
        "SJIS",
        "JIS",
        "ASCII"
    ],
    substitute_character: 63,
    strict_detection: "Off"
}


を返します。
mb_convert_encoding($input['caption'], 'UTF-8', 'ASCII');によって返ってくる結果は良かった点の追加となりました。

ソースコード

FORMのaccept-charsetには"UTF-8"を指定。

<form method="POST" action="http://localhost/test/test" accept-charset="UTF-8" enctype="multipart/form-data">
<input type="submit" value="送信">
<div>
    <h4>写真</h4>
    <ul>
        <li><input name="photo" type="file"><input name="caption" type="text" value="キャプション"></li>
    </ul>
</div>
</form>

コントローラはリクエストから取得したものをそのまま返す。

public function store(Request $request)
{
    $input = $request->input();
    return $input;
}

補足情報(言語/FW/ツール等のバージョンなど)

php.iniはこのような設定をしています。

[PHP]
engine = On
short_open_tag = Off
precision = 14
output_buffering = 4096
output_handler = mb_output_handler
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = 17
disable_functions =
disable_classes =
zend.enable_gc = On
expose_php = On
max_execution_time = 30
max_input_time = 60
memory_limit = 128M
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
html_errors = On
variables_order = "GPCS"
request_order = "GP"
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 8M
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
default_charset = "UTF-8"
doc_root =
user_dir =
enable_dl = Off
file_uploads = On
upload_max_filesize = 2M
max_file_uploads = 20
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60


[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
mbstring.detect_order = UTF-8,SJIS,EUR-JP,JIS,ASCII
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

nasuさんも述べてますが、本来は、

mbstring.http_input = pass


として使わないのがBESTです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/18 12:15

    回答ありがとうございます。
    5系の情報を見ながら設定していました。
    現在は

    ```
    [mbstring]
    mbstring.language = Japanese
    mbstring.internal_encoding = UTF-8
    mbstring.http_input = pass
    mbstring.http_output = pass
    mbstring.encoding_translation = Off
    mbstring.detect_order = auto

    ```

    と設定しました。

    キャンセル

0

-mbstring.http_input = auto
+mbstring.http_input = UTF-8

php.iniを上記のように変更することでひとまず解決しました。
ですが、mbstring.http_inputを決め打ちしてしまってよいものなのか疑問が残ります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/18 09:55

    HTMLのヘッダが書かれてなかったのでわかりませんが・・・
    > mbstring.http_inputを決め打ちしてしまってよいものなのか疑問が残ります。

    HTMLでもUTF-8と明示してあるなら特に問題はないと思います。

    それ以前にPHP7なんですよね? すでに非推奨になってますよ。
    http://php.net/manual/ja/mbstring.configuration.php#ini.mbstring.http-input

    キャンセル

  • 2016/03/18 12:15

    回答ありがとうございます。
    5系の情報を見ながら設定していました。
    現在は

    ```
    [mbstring]
    mbstring.language = Japanese
    mbstring.internal_encoding = UTF-8
    mbstring.http_input = pass
    mbstring.http_output = pass
    mbstring.encoding_translation = Off
    mbstring.detect_order = auto

    ```

    と設定しました。

    キャンセル

0

[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.encoding_translation = Off
mbstring.detect_order = auto

と設定することで解決。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る