PHP 字符编码问题

PHP character encoding problems

提问人:James 提问时间:5/6/2009 最后编辑:hakreJames 更新时间:10/21/2012 访问量:11084

问:

我需要帮助解决一个字符编码问题,我想一劳永逸地解决该问题。下面是我从 XML 提要中提取的一些内容的示例,插入到我的数据库中,然后拉出。

正如你所看到的,很多特殊的html字符被损坏/破坏。

我怎样才能一劳永逸地阻止这种情况?我如何能够支持所有类型的角色等?

我已经尝试了我能找到的每一段编码,它有时会纠正大多数人的编码,但仍有其他人被损坏了。

PHP XML UTF-8 字符编码

评论

0赞 John Rasch 5/6/2009
它们在什么时候看起来“破碎”?如果您在浏览器中查看源,是否看到乱码或正确的字符?XML 声明中是否有“encoding”属性?
0赞 zombat 5/6/2009
只是一个快速的想法,但您能告诉我们您的数据库表在哪个字符集中吗?如果您在MySQL中的表上执行“SHOW CREATE TABLE tblname;”,您应该在末尾看到类似“DEFAULT CHARSET=utf8”的内容。
0赞 hakre 10/21/2012
您的代码从互联网上消失了。请再次将其添加到您的问题中,否则将继续删除。请注意将您提出的重要部分放入问题本身中!

答:

3赞 Paul G. 5/6/2009 #1

我最喜欢的关于JoelOnSoftware编码的文章:每个软件开发人员绝对必须了解Unicode和字符集的绝对最低限度

评论

0赞 James 5/6/2009
很有用,但到目前为止仍然没有帮助我:(我需要一些PHP特定的建议
0赞 Alana Storm 5/6/2009
Joel 的那篇文章很有帮助,但它有点或回避了 unicode 支持“破碎/不稳定”的事实,因为产品太多了,以至于很难定义什么是好公民。更不用说实施它了。
0赞 Jordan S. Jones 5/6/2009 #2

首先,确保数据库的字符编码设置为支持 UTF-8。其次,PHP 的 ICONV 将成为您的朋友。最后,确保您的响应标头发送正确的字符编码(同样是 UTF-8)。

1赞 Gumbo 5/6/2009 #3

UTF-8 编码的文本似乎是用 ISO 8859-1 解释的。

如果要处理 XML 文档,则必须使用 HTTP 标头字段 Content-Type 的参数或 XML 声明的属性中给定的编码。如果两者都没有给出,则 XML 规范将 UTF-8 或 UTF-16 声明为默认字符编码,您必须使用一些检测charsetencoding

0赞 Seb 5/6/2009 #4

你试过utf8_encode()utf8_decode()吗?

使用哪一个将完全取决于您的数据编码方式,您没有指定,但它们对于此类情况非常有用。

0赞 James 5/6/2009 #5
header('Content-type: text/html; charset=UTF-8') ;

/**
 * Encodes HTML safely for UTF-8. Use instead of htmlentities. 
 *
 * @param string $var 
 * @return string 
 */
function html_encode($var)
{
    return htmlentities($var, ENT_QUOTES, 'UTF-8');
}

那两个人救了我,我认为它现在正在起作用。如果继续遇到问题,我会回来的。我应该将其存储在数据库中,例如“&”还是“&”?

评论

1赞 Gumbo 5/6/2009
尽管 UTF-8 可以对其他字符进行编码,但为什么要使用字符引用?如果您真的必须替换它们,仅使用替换 HTML 特殊字符就足够了。htmlspecialchars
1赞 John 5/6/2009 #6

看起来您提供的链接包含以 utf-8 编码的数据。(点击该链接,然后将浏览器的编码更改为 utf-8)。

听起来您在从数据库中插入和检索时遇到了问题。确保您的数据库表已将 utf-8 设置为编码。

12赞 Petrunov 5/7/2009 #7

绝对一劳永逸地确保您永远不会再遇到编码问题:

随时随地使用 UTF-8!

也就是说(如果您使用 mysql 和 php):

  • 例如,将数据库中的所有表设置为排序规则“utf8_general_ci”。
  • 建立数据库连接后,运行以下 SQL 查询:“SET NAMES 'utf8'”
  • 始终确保编辑器的设置设置为 UTF-8 编码。
  • 在 HTML 文档的部分中具有以下 meta 标记:

    <meta http-equiv=“content-type” content=“text/html;字符集=utf-8“>

还有一些额外的提示:

或:

你可以只使用一个简单的服务器端配置文件来处理所有编码问题。在这种情况下,您根本不需要标头和/或元标记或修改 php.ini 文件。只需将您想要的字符集编码添加到 .htaccess 文件中,然后将其放入您的 www 根目录中。如果你想摆弄字符集字符串并使用你的 php 代码 - 那是另一回事了。当然,数据库排序规则必须正确。

脚注:UTF-8 不是编码解决方案是一种解决方案。使用什么字符集/编码并不重要,只要已经考虑到使用的环境。

1赞 Christian 12/23/2009 #8

在连接到数据库之后,但在执行任何事务之前,请执行以下行,以确保所有数据库通信都采用 UTF-8 格式:

mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'", $dbconn);