2014-09-03 89 views
0

我在一个web应用程序中遇到了一个奇怪的问题。奇怪的PHP charset问题?

它是存储关于金属制品数据的应用程序,因此使用O形符号很多。 当我在Windows 7或我的Vista电脑上运行应用程序(都是32位)时,Ø被存储为Ø。 当我在Windows 8(64位)上运行应用程序时,Ø被存储为oslash;我不想要。

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

而且当我和我的Windows 8连接与在Windows 7的Vista中运行的应用程序,一切工作正常,O是存储为Ø。 反过来,使用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'); 

DB访问:

mysql_query("SET NAMES UTF8"); 

和我用下面从HTML获得价值PHP:

htmlentities($_POST[$name]); 

但是,这并不能真正成为问题,因为它适用于WIN7/Vista的

任何人有一个想法是什么可能是这个问题,我该如何解决?

在此先感谢

+2

mysql与此无关。它将**从不**为你做实体编码。这不是它的工作。如果你用oslash取出oslash,那是因为你首先把oslash塞进了mysql。 – 2014-09-03 18:44:06

+2

你应该只使用'htmlentities'和'echo'结合。不要在插入数据库的值上使用它。 – GhostGambler 2014-09-03 19:20:18

回答

1

如果你问的HTML实体,正确的行为是为了获得oslash;。错误的安装是旧的,这个字符没有被检测为必须被实体解码。

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

如果你这样做了一个安全原因那么你这样做错误。规则是根据目的地筛选/转义所有内容。

  • 当存储在数据库中的东西,您使用的所有东西都应该被过滤对SQL语言的滥用。
  • 当你在HTML页面中输出不同的是,您的动态用户内容应针对HTML转义
  • 相同的规则对于其他目的地,如JSON,CSV等

htmlentites是一个html逃避者,它防止任何奇怪的字符(如'<')被解释为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($str, ENT_QUOTES, "UTF-8"); 

你肯定会需要调用这个函数ヶ辆,但它应该只是HTML输出前进行设置,也许对代码的完全地不同的部分,在view一部分。

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

  • 使用parametized查询中使用mysql_real_escape_string
  • (迄今为止最好的)
  • (...)