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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

2回答

8571閲覧

PHP ローカルでもサーバーでもUTF-8なのにフォームで送信すると文字が化ける

urdapple

総合スコア83

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2017/05/29 09:00

編集2017/05/29 09:06

趣旨はタイトルの通りなのですが詳細を・・・

テスト環境
xampp
PHPバージョン 5.5.9
php.iniの日本語エンコードに関する設定
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.encoding_translation = Off
MySQLバージョン 5.5.16

サーバー側実行環境
CPIレンタルサーバ
PHPバージョン 5.5.16
php.iniの日本語エンコードに関する設定
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.encoding_translation = On
MySQLバージョン 5.5.14

MVCはCakePHP2を利用してWebアプリケーションを製作中。

この状況でサーバ側の各階層にある複数の.htaccessファイルには
AddDefaultCharset UTF-8
AddType "text/html; charset=UTF-8" .html .php
を先頭に記入し、

htmlファイルのmeta要素には
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

このあたりは全て記入済み。
全ファイルBOM無しのUTF-8で保存。

この状況でローカルからフォームでデータを送ると、テスト環境では問題なく日本語が送られるのに、実行環境では文字化けを起こしてしまいます。
「データベースに保存したら」とか、「ファイルに書き出したら」ではなく、サーバー側に送られたデータをdebug()関数で出力すると、その段階でもう文字化けを起こしている感じなんです。
ちなみにサーバー側に送られたデータをmb_detect_encodingで調べると「UTF-8」として認識はされていました。
なのにdebug()関数でそのデータを吐き出させると「あいうえお」が「あいうえお」のようにISO-8859-1っぽい化け方で表示されます。

ちなみにmb_internal_encoding()関数で内部文字コードを確認しても「UTF-8」と出力されます。
試しに同じ関数でphpファイル文頭にmb_internal_encoding("utf-8")を指定してもダメでした。
内部的にどんな言語でやりとりされていても、最終的にちゃんとUTF-8で読める文字で保存してくれれば問題ないのですが、そのままDBに保存した所、DB上でも「あいうえお」のまま保存されてしまっていました。ちなみにMySQLも設定関係すべてUTF-8で統一しています。

ちょっとどうにも手を尽くしたのにまったく直る方策が思い浮かばないので、どなたか何かこの問題にヒントだけでも与えてくださると助かりますm(_ _)m
よろしくお願いします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

HTTPサーバの文字セット設定はどうなってんだろう
あたりが気になりましたが、関係ないかな?

form タグに accept-charset属性なるものが
指定できるようなので使ってみたらどうでしょう。

あと、submit時に charsetを指定する方法もあるよう。

<input type='submit' value='送信' onclick="document.charset='xxx';">

確証の無い話ばかりで申し訳ないス。

投稿2017/05/29 09:39

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

urdapple

2017/05/29 09:47

あ、なるほど! 送る段階のフォームでも設定できましたっけね! 結果「mbstring.encoding_translation」をOffにすることで直ってしまったんですが、実は別のフォームで送ったデータは文字化けせずに送れてしまっているという現状もあり、ちょっとこれも試してみます! ありがとうございますm(_ _)m
urdapple

2017/05/29 10:01

php.iniのmbstring.encoding_translation設定を元に戻し(On)て、form自体に「accept-charset="UTF-8"」を設定してみましたがダメでした・・・ ちなみにsubmit前にdocumentのキャラセットをごっそり交換する方法も今度試してみますm(_ _)m
guest

0

ベストアンサー

こんにちは
本番環境の
mbstring.encoding_translation = On
もoffにしてみては?

https://www.communitycom.jp/2013/09/26/cpi-utf8/
※情報事態は古いものです。現状とことなるかもです。

投稿2017/05/29 09:25

編集2017/05/29 09:26
kogure

総合スコア299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

urdapple

2017/05/29 09:30

mbstring.internal_encodingが別コードならそれも考えたんですが、そこもUTF-8だったのでスルーしてたんですよね。 ちょっとやってみますm(_ _)m
kogure

2017/05/29 09:33

やってみてうまくいけばハッピー!なので色々試してみて損はないかなと思います。
urdapple

2017/05/29 09:43

うわぁああああああ直りましたぁぁああぁああああああil||li_| ̄|○il||li きっかけをいただきましてありがとうございますm(_ _)m でもこれ結果的に直ったんですけど、どうしてこうなるのかわかんないままなのがとても気持ち悪いです(´・ω・) とりあえずこれに関する情報をもう少し待ちたいのでしばらくこのまま回答募集してますが、BAはkogureさんとさせていただきますのでご了承下さいm(_ _)m>以降回答いただける方
kogure

2017/05/29 10:09

よかったです! だれか詳しい人が教えてくれれば私も助かります。w でも、なんであーなったかは、たぶんサーバー全体の文字コードが「uft-8」以外で設定されていて (echo $LANGとかで見れるかも。) encoding_translation = on にしてると内部文字エンコーディングに変換されるとかで引っかかっていたんじゃないですかね encoding_translation = offにすることでphp.iniとか.htaccessの設定を優先されるようになったかと。 正しい情報まちましょう!!わくわく
urdapple

2017/05/29 11:28 編集

気になってsshで実行環境に接続して「echo $LANG」やら「locale」やらコマンド打ち込んでみたんですけど、コマンド使えなくてショボーンでした(´・ω・) まぁレンタルサーバですしね(;´Д`) ちなみにOSがFreeBSD 8.4なんで、内部はEUCなのかなって予測です。 ただUTF-8がEUCに化けた時って「?」の羅列になる化け方がよくあるパターンですよね? なので今回みたいにISO-8859-1っぽい化け方になるかなぁとそこも気持ち悪いままなんです( ̄▽ ̄;)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問