PHPの文字化けについて教えて下さい
created: 2009-06-26 10:06 | modified: 2009-07-03 11:24 | reply: 5
[4313] PHPの文字化けについて教えて下さい - tsubasa - 2009-06-26 10:06- [4314] 文字化け対策の心がけ他 - ゆうじ - 2009-06-27 02:26
- [4315] Re:文字化け対策の心がけ他 - tsubasa - 2009-06-29 15:17
- [4316] UTF-8の変更によるエラーが解消できません。。。 - tsubasa - 2009-07-02 10:41
- [4317] SQL Server のフィールド名にUTF-8 - ゆうじ - 2009-07-03 00:06
- [4318] Re: SQL Server のフィールド名にUTF-8 - tsubasa - 2009-07-03 11:24
[4314] 文字化け対策の心がけ他
user: ゆうじ | created: 2009-06-27 02:26
こんばんわ。
「\」が出るってことは、magic_quotes_gpc は On ですか。
これが On だと「\」の文字が「\\」のようにエスケープされます。
ややこしいことに、Shift_JIS の文字コードには
2バイト目に「\(\x5C)」を含む文字が存在するので
magic_quote_gpc が On だと、
これらの直後に余分な「\」が付け加えられます。
「ソ(\x835C)」「表(\x955C)」なんかがそうです。
文字列処理を行うときには
エスケープしたままでは不都合ばかりなので
必ずエスケープを排除してからというのが実際です。
また PHP6 では magic_quote_gpc 設定そのものがなくなる見込みです。
なので magic_quote_gpc は Off で運用するよう考えた方がいいです。
そのうえで、必要な個所で最低限のエスケープ処理を行ったほうが
はるかにわかりやすく、Shift_JISのような副作用を招かずに済みます。
「\(\x5C)」の件は、Shift_JIS の文字コードの問題なので
PHPに限らず他の言語やアプリケーションでも副作用がありえます。
考えられてるように EUC や UTF-8 で統一する方向をおすすめします。
この他に文字化けの原因があるとすれば、
文字エンコーディングの誤検出だろうと推測できますが
誤検出個所や文字列が特定できないと対処もできません。
先ずは各ポイントで、想定した通りの文字エンコーディングか
mb_detect_encoding と bin2hex あたりを使って
確かめてみるしかありませんね。
SQL Server は使ったことが無くまったくわかりません。
こちらも知識不足ですみません。
おまけで、私の文字化け防止5か条です。
1.可能な限り、エスケープを含まない生データを取り扱う。
2.可能な限り、文字エンコーディングを統一する。
3.可能な限り、文字エンコーディング変換は行わない。
4.$_GET $_POST $_COOKIE の値は必ず文字エンコーディングを検出し
必要があればPHPの内部エンコーディングに変換する。
5.DBやファイルなど外部への入出力時は、
必要があれば文字エンコーディング変換を行い
あわせてそれぞれの形式にあったエスケープ処理を行う。
「\」が出るってことは、magic_quotes_gpc は On ですか。
これが On だと「\」の文字が「\\」のようにエスケープされます。
ややこしいことに、Shift_JIS の文字コードには
2バイト目に「\(\x5C)」を含む文字が存在するので
magic_quote_gpc が On だと、
これらの直後に余分な「\」が付け加えられます。
「ソ(\x835C)」「表(\x955C)」なんかがそうです。
文字列処理を行うときには
エスケープしたままでは不都合ばかりなので
必ずエスケープを排除してからというのが実際です。
また PHP6 では magic_quote_gpc 設定そのものがなくなる見込みです。
なので magic_quote_gpc は Off で運用するよう考えた方がいいです。
そのうえで、必要な個所で最低限のエスケープ処理を行ったほうが
はるかにわかりやすく、Shift_JISのような副作用を招かずに済みます。
「\(\x5C)」の件は、Shift_JIS の文字コードの問題なので
PHPに限らず他の言語やアプリケーションでも副作用がありえます。
考えられてるように EUC や UTF-8 で統一する方向をおすすめします。
この他に文字化けの原因があるとすれば、
文字エンコーディングの誤検出だろうと推測できますが
誤検出個所や文字列が特定できないと対処もできません。
先ずは各ポイントで、想定した通りの文字エンコーディングか
mb_detect_encoding と bin2hex あたりを使って
確かめてみるしかありませんね。
SQL Server は使ったことが無くまったくわかりません。
こちらも知識不足ですみません。
おまけで、私の文字化け防止5か条です。
1.可能な限り、エスケープを含まない生データを取り扱う。
2.可能な限り、文字エンコーディングを統一する。
3.可能な限り、文字エンコーディング変換は行わない。
4.$_GET $_POST $_COOKIE の値は必ず文字エンコーディングを検出し
必要があればPHPの内部エンコーディングに変換する。
5.DBやファイルなど外部への入出力時は、
必要があれば文字エンコーディング変換を行い
あわせてそれぞれの形式にあったエスケープ処理を行う。
