我不确定如何正确地说出这个问题,但是这里有。我工作的地方,我们的生产服务器是一个LAMP服务器(我们计划保持这种方式)。但是,我们所有的工作站都是基于Windows的。
问题在于,因为这两个系统使用不同的基本字符集,所以当涉及重音字符时,本地看起来不错的东西将不可避免地在生产中混乱(当然,除非我们经常对PHP_OS运行检查)。 / p>
所以基本上,我们要做的是设置一个允许我们在本地输出与生产服务器相同的输出。你喜欢在Windows中运行Apache服务器作为Linux吗?
编辑:我尝试了几件事,都没有成功。我尝试的第一件事是将以下内容添加到httpd.confAddDefaultCharset utf-8
然后我尝试编辑文件charset.conv并将第一个条目设为utf8并且它没有做任何事情。现在,当我尝试从数据库(UTF8)访问数据时,会出现问题。
$sql = "SELECT DISTINCT f.NoClient ,c.NomClient
FROM flexgroup.tblfacturation f
INNER JOIN flexgroup.tblclients c ON c.NoClient = f.NoClient
WHERE f.NoAssureur = 2 ORDER BY c.NomClient";
$stmt = $c -> prepare( $sql );
$stmt -> execute();
while($res = $stmt -> fetch(PDO::FETCH_ASSOC))
{
echo "<option value=\"" . $res['NoClient'] . "\">" . $res['NomClient'] . "</option>\n";
}
上面的脚本在Linux中开箱即用,但在Windows中,我必须将输出包装在utf8_encode中,如下所示:
echo "<option value=\"" . $res['NoClient'] . "\">" . utf8_encode($res['NomClient']) . "</option>\n";
有人有建议吗?
答案 0 :(得分:0)
也许这超出了您的要求,但您可以在Windows操作系统中运行Linux虚拟机。在我工作的地方,我们使用VMPlayer(任何虚拟机都适用于Windows),并在VMPlayer中运行Centos作为客户操作系统,因此它与我们在生产中使用的相匹配。
答案 1 :(得分:0)
好的,事实证明答案真的是在httpd.conf中。唯一的事情是我没有添加正确的字符集。我需要添加的内容如下:
AddDefaultCharset UTF-16
我认为在这里发生的是,Vertica的ODBC驱动程序检测其安装的操作系统,并将收到的内容转换为它认为合适的字符集。这就是为什么它在Linux中工作,其中所有地方都只是UTF-8。
然而,在Windows中,ODBC驱动程序在将字符串的编码转换为我的应用程序之前将其更改为ISO-8859-1。当然,我的应用程序认为它正在接收UTF-8数据,因此由于字符集不匹配,显示最终会出现乱码。
好的,我进一步深入研究,并且能够更清楚地了解发生的事情。我认为驱动程序检测到它安装在哪个平台上是对的。但是,它用于Windows的charset实际上是UTF-16,而不是我原先认为的ISO-8859-1。我混淆的原因是两个编码相交,就数字和字母而言。我也假设因为它们的名字相似,UTF-8和UTF-16兼容......显然它们不是。
无论如何,我希望这有助于将来。
大须