我有一台 Fedora 机器作为服务器,运行 php 5.3 的 apache
脚本充当向我发送“消息”的各种来源的入口页面。
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 编码时它会起作用?