PHP字符编码问题

6

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

正如你所看不到的那样,许多特殊的HTML字符会被破坏/损坏。

我应该如何才能彻底解决这个问题?我如何支持所有类型的字符等等?

我已经尝试了几乎所有可用的编码方法,有时候可以修复大部分问题,但仍有一些字符被破坏。


它们在什么时候出现“损坏”?如果您在浏览器中查看源代码,您是否看到了乱码或正确的字符?XML声明中是否有“编码”属性? - John Rasch
只是一个快速的想法,你能告诉我们你的数据库表使用的字符集是什么吗?如果在MySQL中对你的表执行“SHOW CREATE TABLE tblname;”,你应该会看到最后有类似于“DEFAULT CHARSET=utf8”的东西。 - zombat
你的代码从互联网上消失了。请将其再次添加到你的问题中,否则它将被删除。请注意将你所询问的重要部分放入问题本身! - hakre
8个回答

12

要彻底解决编码问题,请在所有地方和所有东西上使用UTF-8编码!

如果您使用mysql和php:

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

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

另外几个提示:

或者:

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

注:UTF-8不是解决编码问题的唯一方法,它只是一种解决方案。无论使用什么字符集/编码,只要考虑到所使用的环境即可。


3

非常有用,但到目前为止仍然没有帮助我 :( 我需要一些关于PHP的具体建议。 - James
那篇Joel的文章很有帮助,但它回避了Unicode支持在许多产品中存在“破损/不稳定”的事实,以至于很难定义成为一个好公民是什么,更不用说实现它了。 - Alana Storm

1
在连接到数据库之后,但在执行任何事务之前,请执行以下行以确保所有数据库通信都是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);

1

看起来UTF-8编码的文本被解释为ISO 8859-1。

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


1

看起来你提供的链接中有使用 UTF-8 编码的数据。(请点击该链接,然后将你的浏览器编码设置为 UTF-8)。

看起来你在插入和检索数据库方面存在问题。请确保你的数据库表已设置为 UTF-8 编码。


0
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
尽管UTF-8可以编码所有字符,为什么您要使用字符引用?如果您确实需要替换HTML特殊字符,只需使用htmlspecialchars即可。 - Gumbo

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

0

你尝试过 utf8_encode()utf8_decode() 吗?

你使用哪一个完全取决于你的数据编码方式,但它们对这种情况非常有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接