我在我的网络应用程序中遇到了一个奇怪的问题。
这是一个存储有关金属产品数据的应用程序,因此使用了很多的Ø符号。 当我在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
任何人都知道可能出现的问题以及如何解决问题?
提前致谢
答案 0 :(得分:1)
如果您要求使用html实体,正确的行为是获取oslash;
。错误的安装是旧的安装,其中未检测到该字符必须被实体解码。
现在,正如@GhostGambler在评论中解释的那样,真正的问题是在将数据插入数据库之前,您不需要请求输入的html实体解码版本。
如果您为安全原因执行此操作,那么您正在执行错误。规则是根据目的地过滤/转义所有内容。
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