需要帮助解决 Apache Windows VS Linux 字符集问题
Need help solving Apache Windows VS Linux charset problems
我不确定如何正确地表达这个问题,但这里是。在我工作的地方,我们的生产服务器是 LAMP 服务器(我们计划保持这种状态)。但是,我们所有的工作站都是基于 Windows 的。
问题是,因为两个系统使用不同的基本字符集,一旦涉及重音字符,在本地看起来不错的东西在生产中将不可避免地看起来乱七八糟(当然,除非我们经常 运行检查 PHP_OS).
基本上,我们要做的是进行设置,使我们能够在本地获得与生产服务器上相同的输出。您可以像 Windows 中的 Linux 一样喜欢 运行 Apache 服务器吗?
编辑:我尝试了几件事,但都没有成功。我尝试的第一件事是将以下内容添加到 httpd.conf
AddDefaultCharset 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";
有人有建议吗?
也许这超出了您的要求也许不是,但您可以 运行 在 windows OS 中创建一个 Linux 虚拟机。在我工作的地方,我们为 Windows 使用 VMPlayer(任何虚拟机都可以),VMPlayer 中的 运行 Centos 作为来宾操作系统,因此它与我们在生产中使用的相匹配。
好吧,事实证明答案确实在 httpd.conf 中。唯一的问题是我没有添加正确的字符集。我需要添加的是以下行:
AddDefaultCharset UTF-16
我认为 在这里发生的是 Vertica 的 ODBC 驱动程序检测 OS 它安装在哪个上并将它接收到的内容转换成它认为合适的字符集。这就是它在 Linux 中工作的原因,那里所有地方都只是 UTF-8。
然而,在 Windows 中,ODBC 驱动程序甚至在字符串到达我的应用程序之前就将字符串的编码更改为 ISO-8859-1。当然,我的应用程序认为它正在接收 UTF-8 数据,因此由于字符集不匹配,显示最终出现乱码。
好的,我进一步研究并且能够更清楚地了解发生了什么。我认为驱动程序检测到它安装在哪个平台上是正确的。然而,它用于 Windows 的字符集实际上是 UTF-16,而不是我最初认为的 ISO-8859-1。我感到困惑的原因是,就数字和字母而言,这两种编码相交。由于名称相似,我还假设 UTF-8 和 UTF-16 是兼容的……显然它们不是。
无论如何,我希望这对以后的人有所帮助。
奥苏
我不确定如何正确地表达这个问题,但这里是。在我工作的地方,我们的生产服务器是 LAMP 服务器(我们计划保持这种状态)。但是,我们所有的工作站都是基于 Windows 的。
问题是,因为两个系统使用不同的基本字符集,一旦涉及重音字符,在本地看起来不错的东西在生产中将不可避免地看起来乱七八糟(当然,除非我们经常 运行检查 PHP_OS).
基本上,我们要做的是进行设置,使我们能够在本地获得与生产服务器上相同的输出。您可以像 Windows 中的 Linux 一样喜欢 运行 Apache 服务器吗?
编辑:我尝试了几件事,但都没有成功。我尝试的第一件事是将以下内容添加到 httpd.conf
AddDefaultCharset 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";
有人有建议吗?
也许这超出了您的要求也许不是,但您可以 运行 在 windows OS 中创建一个 Linux 虚拟机。在我工作的地方,我们为 Windows 使用 VMPlayer(任何虚拟机都可以),VMPlayer 中的 运行 Centos 作为来宾操作系统,因此它与我们在生产中使用的相匹配。
好吧,事实证明答案确实在 httpd.conf 中。唯一的问题是我没有添加正确的字符集。我需要添加的是以下行:
AddDefaultCharset UTF-16
我认为 在这里发生的是 Vertica 的 ODBC 驱动程序检测 OS 它安装在哪个上并将它接收到的内容转换成它认为合适的字符集。这就是它在 Linux 中工作的原因,那里所有地方都只是 UTF-8。
然而,在 Windows 中,ODBC 驱动程序甚至在字符串到达我的应用程序之前就将字符串的编码更改为 ISO-8859-1。当然,我的应用程序认为它正在接收 UTF-8 数据,因此由于字符集不匹配,显示最终出现乱码。
好的,我进一步研究并且能够更清楚地了解发生了什么。我认为驱动程序检测到它安装在哪个平台上是正确的。然而,它用于 Windows 的字符集实际上是 UTF-16,而不是我最初认为的 ISO-8859-1。我感到困惑的原因是,就数字和字母而言,这两种编码相交。由于名称相似,我还假设 UTF-8 和 UTF-16 是兼容的……显然它们不是。
无论如何,我希望这对以后的人有所帮助。
奥苏