【问题标题】:php not encoding em dash (among other things correctly);php 没有编码破折号(除其他外正确);
【发布时间】:2012-08-24 06:43:18
【问题描述】:

我有一个小的 JSON 对象,我想将它发送到 php 以放入 mySQL 数据库。字符串中的部分信息是 html 实体。 &emdash 给我带来了问题。它显示为â€é 显示为 é 时还有一些其他问题。

我似乎遇到了一些编码问题。知道有什么问题吗?谢谢

【问题讨论】:

  • 可能是您数据库的字符集。猜测一下,它设置为 iso-8859-* 并且因为数据来自 JSON,它将被编码为 un​​icode。将您的数据库字符集更改为 UTF-8。
  • @DaveRandom 谢谢!很抱歉很愚蠢,但这是我逐表设置,还是逐个数据库设置,或者只是为我的整个 mySQL 设置?
  • 可以按数据库、按表甚至按列设置。对于此特定任务,您只需对存储此数据的列执行此操作,但如果不与其他任何内容冲突,我建议您转换整个数据库。
  • @DaveRandom 在 PHPMyAdmin 的“操作”下,我看到我已将“排序规则”设置为“latin1_swedish_ci”。在大量下拉列表中有一个 UTF-8 选项。只是有点困惑,因为它被称为“整理”而不是“编码”;这是我想要的吗?
  • 是的,但这不会影响表中的现有列,它只会影响您创建的新列并且不指定编码。在那里更改它,然后进入表格并编辑所有 VARCHAR/CHAR/TEXT 列。

标签: php html-entities html-encode


【解决方案1】:

因为数据来自 JSON,所以应该用 Unicode 字符集编码,默认为 UTF-8 [Sources: Douglas Crockford, RFC4627]

这意味着为了在数据库中存储非 ASCII 字符,您需要将传入数据的编码转换为数据库的字符集,或者(最好)为您的数据库使用 Unicode 字符集数据库。最常见的 Unicode 字符集 - 也是我建议您用于此目的的字符集 - 是 UTF-8。

您的数据库很可能是使用其中一种拉丁字符集 (ISO-8859-*) 设置的,在这种情况下,您很可能只需要更改用于表的字符集,它不会破坏任何现有数据的 - 假设您目前没有使用低于 128 位以外的任何字符的记录。根据上面的 cmets,您应该能够使用 phpMyAdmin 进行此更改 - 您需要确保更改每个现有列如果希望显式更改,更改表/数据库的字符集只会影响在未指定字符集的情况下创建的新列/表。

当您向客户端输出数据时,您还需要告诉它您正在输出 UTF-8,以便它知道如何正确显示字符。为此,请确保将 ; charset=utf-8 附加到与基于文本的内容一起发送的 Content-Type: 标头中。

例如,在生成使用 UTF-8 编码的 HTML 的 PHP 脚本的顶部,您可以添加以下行:

header('Content-Type: text/html; charset=utf-8');

还建议您在文档本身内声明文档的字符集。此声明必须出现在之前文档中存在的任何非ASCII字符 - 因此,建议您将以下<meta>标签作为<head>的第一个子标签:

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

如果您生成的 XHTML 在顶部带有 XML 声明,则可以在此处声明字符集,而不是使用 &lt;meta&gt; 标记:

<?xml version="1.0" encoding="UTF-8" ?>

请记住,在 Content-Type: 标头中使用字符集定义不限于 text/html - 在任何 text/* 系列 MIME 类型的上下文中都是有意义的。

延伸阅读:What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text

另外,请确保您validate your markup

【讨论】:

  • 为什么我的 mySQL 的默认值还是要设置为latin1_swedish_ci ? ^^
  • 另外,utf8_unicode_ci 是我列表中与您建议的 UTF-8 最接近的项目。实际上,UTS-8 的数量与语言的数量一样多。虽然奇怪的不是英语。你觉得这次选品满意吗。还有UTF8-bin。再次感谢您的帮助和出色的回答!
  • @thomas 默认为瑞典语的问题已解决here - 总而言之,“没有人真正知道”。如果您真的想知道各种 UTF-8 排序规则之间的区别是什么,您需要的所有信息都可以在here 中找到。我个人对我的生活有更好的事情要做...... ;-)。总而言之,如果您只想支持西方文字和“高级”标点符号,那么任何人都可以。
  • 如果你不担心,我也不担心。 :) 感谢所有的帮助。这解决了所有问题。
猜你喜欢
  • 1970-01-01
  • 2021-03-03
  • 2023-03-18
  • 1970-01-01
  • 2021-10-19
  • 2016-01-23
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
相关资源
最近更新 更多