我有我的Debian服务器上的PHP UTF-8字符串的问题。
更新详细
从来就做多一点测试,现在情况更加具体。 我更新了标题和细节,以更好地适应它的情况。 感谢您的答复和遗憾的是,这个问题wasn't明确说明。 下面的脚本作品在我的本地Windows计算机上,但不是我的Debian服务器上的罚款:
<?php
header("Content-Type: text/html; charset=UTF-8");
$string = '<html><head></head><body>UTF-8: ÄÖÜ<br /></body</html>';
$document = new DOMDocument();
@$document->loadHTML($string);
echo $document->saveHTML();
echo $string;
正如我的本地机器上的预期输出是:
UTF-8: ÄÖÜ
UTF-8: ÄÖÜ
我的服务器上的输出:
UTF-8: ÄÖÜ
UTF-8: ÄÖÜ
我在UTF-8写在记事本++脚本没有BOM和转移过来SSH。 由于注意到由Guido字符串本身是正确的UTF-8编码。 似乎是用PHP DOM或可能libxml的问题。 其原因必须有一些设置,因为它是依赖于机器。
原来的问题
我用XAMPP在Windows本地工作,一切都很好。 但是,当我在服务器上部署我的项目UTF-8字符串得到全乱了。 事实上,当我上传这个测试脚本
echo utf8_encode('UTF-8 test: ÄÖÜ');
我得到的“AAA”。 此外,当我用腻子连接到服务器,我不能写变音(AOU)正确的外壳。 我不知道,如果这个问题甚至PHP相关。
检查你的apache的AddDefaultCharset
设置。
上标准的Debian apache的分布,设定可以在改性/etc/apache2/conf.d/charset
。
请确认您的文件是字节到字节一样在本地计算机上。 在文本模式下的FTP传输可能把事情搞糟。 你可能想尝试二进制之一。
编辑 :答案更新的问题:
<?php
header("Content-Type: text/html; charset=UTF-8");
$string = '<html><head>'
.'<meta http-equiv="content-type" content="text/html; charset=utf-8">'
.'</head><body>UTF-8: ÄÖÜ<br /></body</html>';
$document = new DOMDocument();
@$document->loadHTML($string);
echo $document->saveHTML();
echo $string;
?>
我怀疑你的输入字符串可能已经UTF-8。 尝试:
setlocale(LC_CTYPE, 'de_DE.UTF-8');
$s = "UTF-8 test: ÄÖÜ";
if (mb_detect_encoding($s, "UTF-8") == "UTF-8") {
echo "No need to encode";
} else {
$s = utf8_encode($s);
echo "Encoded string $s";
}
你明确地发送content-type头? 如果你忽略它,它很可能是Apache是送一个给你。 如果该文件与Latin-1编码(阿帕奇)提供服务和浏览器把它读成这样,那么你的UTF-8字符将是畸形的。
尝试这个:
<?php
echo "Drop some UTF-8 characters here.";
那么这样的:
<?php
header("Content-Type: text/html; charset=UTF-8");
echo "Drop some UTF-8 characters here.";
第二个应该工作,如果第一次没有。 您可能还需要将文件保存为UTF-8编码的文件,如果它是不是已经。
如果你的数据库字符搞砸了,尝试设置(我的)SQL连接编码。
尝试改变在php.ini文件服务器上的字符集defualt:
DEFAULT_CHARSET = “UTF-8”
此外,请确保您所传送出正确的内容类型头为UTF-8
在我与UTF-8的经验,如果你正确地配置PHP MBSTRING模块,并使用MBSTRING功能,并且确保你的数据库连接是使用UTF-8,那么你将不会有任何问题。
该数据库可以部分为MySQL做与查询“SET NAMES‘UTF8’”
我通常使用MBSTRING处理缓冲区开始的输出缓冲器。 这是我在生产中使用的网站,它是一个非常坚实的做法。 然后,当你完成渲染您的内容发送缓冲区。
让我知道,如果你想为使SAMPE代码。
另一个简单的伎俩,只是看它是否是由PHP发送出错误的标题或Web服务器是使用浏览器上查看 - >编码菜单,看看它是否是UTF-8。 如果不是,你切换到UTF-8,一切看起来OK,然后它与您的标题或内容类型的问题。 如果已经是UTF-8和文本被搞砸了那东西在你的代码或数据库连接走错了。 如果你正在使用MySQL确保所涉及的表和列也是UTF-8
这个问题的原因是在服务器上的旧版本的libxml的(2.6.32)。 在开发机是2.7.3。 我升级的libxml不稳定的包导致2.7.8版本。 现在的问题都没有了。