サーバーとして機能するFedoraマシンがあり、Apacheがphp 5.3を実行しています
スクリプトは、「メッセージ」を送信するさまざまなソースのエントリ ページとして機能します。
php スクリプトは次serverAddress/phpScript.php?message=MyMessage
のように呼び出されます。メッセージは PDO 経由で保存され、SqlServer 2008 db に接続されます。
メッセージに üäöß のような特殊文字 (ドイツ語など) が含まれている場合、db では正しい文字列ではなく意味不明な文字列が表示されます: ã¼ã¤ã¶ãŸ
データベースはUTF-8に完全に対応しています-他のツールを使用しても問題なくドイツ語の文字を接続して送信/取得できます(php経由ではありません)。
PHPスクリプト内:
- 入力文字列をエコーすると、正しい文字列üäößが得られます
- ファイルに保存すると(入力をログに記録します)、意味不明な内容が表示されます:üã¤ã¶ÃŸ
この動作の原因は何ですか? どうすれば修正できますか?
マルチバイトが有効になっている (yum install php-mbstring に続いて apache の再起動)
私が持っている私のPHPスクリプトの開始時に:
mb_internal_encoding('UTF-8'); mb_http_output('UTF-8'); mb_http_input('UTF-8'); mb_language('uni'); mb_regex_encoding('UTF-8'); ob_start('mb_output_handler');
- PDO経由でmssqlを扱うときのデフォルトのエンコーディングタイプはUTF-8であると私が理解していることから
新規開発:
同僚がPDO_DBLIB ページ(現時点ではキャッシュからのみ表示)を教えてくれました。$res->bindValue(':value', iconv('UTF-8', 'ISO8859-1', $value);
私はすべてを置き換え $res->bindParam(':text',$text);
、 $res->bindParam(':text',iconv('UTF-8', 'ISO8859-1',$text));
すべてが機能しました:)。
mb_internal_encoding.... および他のすべての行は不要になりました。
ISO8859-1 エンコーディングを使用すると機能するのはなぜですか?