奇怪的PHP字符集问题?

时间:2014-09-03 18:32:24

标签: php mysql apache windows-8

我在我的网络应用程序中遇到了一个奇怪的问题。

这是一个存储有关金属产品数据的应用程序,因此使用了很多的Ø符号。 当我在Windows 7或Vista PC(均为32位)上运行应用程序时,Ø存储为Ø。 当我在Windows 8(64位)上运行应用程序时,Ø存储为oslash;这是我不想要的。

我在所有系统上使用相同版本的应用程序,Apache,MySQL和PHP。配置文件(httpd.conf和php.ini)和它们一样好(路径除外)。

当我使用在Vista 7的Windows 7上运行的应用程序连接我的Windows 8时,一切正常,Ø存储为Ø。 反过来说,使用vista在Windows 8上运行应用程序,然后我得到oslash;

我的html页面包含:

<meta http-equiv="Content-type" content="text/html;charset=utf-8"/>

PHP页面以:

开头
header("Content-Type: text/html; charset=utf-8");
date_default_timezone_set('Europe/Brussels');

数据库访问:

mysql_query("SET NAMES UTF8");

我使用以下内容从PHP中获取HTML的值:

htmlentities($_POST[$name]);

但这不是真正的问题,因为它适用于win7 / Vista

任何人都知道可能出现的问题以及如何解决问题?

提前致谢

1 个答案:

答案 0 :(得分:1)

如果您要求使用html实体,正确的行为是获取oslash;。错误的安装是旧的安装,其中未检测到该字符必须被实体解码。

现在,正如@GhostGambler在评论中解释的那样,真正的问题是在将数据插入数据库之前,您不需要请求输入的html实体解码版本。

如果您为安全原因执行此操作,那么您正在执行错误。规则是根据目的地过滤/转义所有内容。

  • 当您在数据库中存储某些内容时,应该针对SQL语言滥用过滤您使用的所有内容。
  • 当您在HTML页面上输出内容时,您的动态用户内容应该针对HTML进行转义
  • 其他目的地的规则相同,如json,csv等

htmlentites是一个html转义器,它可以阻止像'&lt;'这样的奇怪字符被解释为HTML语法的真实字符部分。它还将具有特殊编码的字符转换为html实体(如oslash;)以避免编码问题。在第二项任务中,安全性不那么重要,转换后的字符列表可能会从一个版本的PHP更改为另一个版本。 您可以使用函数get_html_translation_table测试此转换字符列表:

var_dump(get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES, 'WINDOWS-1252'));
var_dump(get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES, 'UTF-8'));
(..)

作为旁注,htmlentities也是一个可以与字符编码参数一起使用的函数,如果你知道从数据库加载的数据的编码是什么:

htmlentities($str, ENT_QUOTES, "UTF-8");

你肯定需要调用这个htmlentities函数,但它应该在HTML输出之前设置,可能在view部分的代码的完全不同部分设置。

要在数据库中使用之前保护您的输入,您还有其他解决方案:

  • 使用mysql_real_escape_string
  • 使用参数化查询(到目前为止最好)
  • (...)