【问题标题】:html page displays cyrillic symbols OK, if contains charset=windows-1251, but not utf-8html 页面显示西里尔符号 OK,如果包含 charset=windows-1251,但不包含 utf-8
【发布时间】:2012-01-04 11:45:24
【问题描述】:

嗯... Html 页面和 mysql 表包含西里尔文字。 为了显示我使用的西里尔文字Барысаў2000

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

在网页上。 为了将该单词存储在 MySQL 表中,使用 utf8_unicode_ci 排序规则(我已经阅读了一些主题,据我了解,建议使用 utf8_unicode_ci 存储西里尔符号)。 但是,我使用 phpMyAdmin 实际看到的,文本 Барысаў2000 在数据库中存储为 Áàðûñà¢2000,这就是我希望解决的问题。 (POST方法+转义危险符号用于将用户的文本保存到数据库中)。 但是,当您选择该数据并将其显示在 html 页面上时,它看起来很好:Барысаў2000。

phpMyAdmin 如何为我显示它的问题直到今天才困扰我。今天我已经尝试解决了。

我猜我必须到处使用 utf-8,所以我从

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

到

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

现在我的页面显示问题而不是西里尔符号,并且在我的数据库中显示西里尔文本的问题没有得到解决。 谁能告诉我是什么问题? 附言我可以毫无问题地阅读塞尔维亚语和白俄罗斯语(西里尔语)网站,并且可以在本地主机上输入西里尔语文本。

谢谢。

【问题讨论】:

  • 您必须在任何地方使用 utf-8 - db 表排序规则、html 字符集。我通常对表格使用 utf8_general_ci 而不是 utf8_unicode_ci。以防万一您可能指定 mysqli_set_charset($connection, 'utf8');设置连接变量后 - php.net/manual/en/mysqli.set-charset.php。您显然从一开始就错了,并且您的数据库中的数据未正确编码,因此它不会正确显示在页面上。还要确保您的 php 文件保存为 'UTF-8 without BOM'

标签: mysql utf-8 character-encoding internationalization cp1251


【解决方案1】:

phpMyAdmin 的问题可能是由错误的字符编码猜测引起的。如果您使用字符集windows 1251 对文本Барысаў2000 进行编码,您最终将得到一个字节流C1 E0 F0 FB F1 E0 A2 32 30 30 30 0D 0A。如果将此字节流解释为采用 ISO-8859-1 或 windows-1252 编码的文本,则结果显示为 Áàðûñà¢2000。

这表明数据库中的字符串实际上是使用 windows-1251 编码存储的。然后,如果您输出这些字符串并仅声明它使用 UTF-8 编码(不进行任何重新编码),则结果将是垃圾文本,因为该字节流包含无效的 UTF-8 字节序列。

您应该继续使用 windows-1251 字符集为您的页面提供服务,并告诉 phpMyAdmin 也使用此字符集,或者您应该在任何地方(也在内部,在数据库中)切换到 unicode。字符转换和猜测所需的正确编码越少,维护系统就越容易。

【讨论】:

  • 感谢您的意见。我还在想问题,解决不了。对我来说神秘的是,即使我在 html 页面上的 meta 中设置了 UTF-8,即使数据库中的每个文本字段都使用 utf8_unicode_ci,即使我没有在页面上显示来自数据库的文本,而是放置一些西里尔文文本在页面上(所以我排除了对phpMyAdmin的可能错误解释),甚至从db中删除了西里尔符号,然后在html页面上可以使用英文文本和数字,但西里尔文本甚至不是Áàðûñà¢2000,而是?????? ?2000。尽管 FF 或 IE 中的任何西里尔文网站看起来都不错。2 天时间思考为什么。
  • @Haradzieniec 尝试切换浏览器的字符编码并判断哪个字符集似乎有效。然后你就会知道你的 HTML 文件 真正 使用什么编码。请注意,如果在 HTTP 标头中定义了编码,则可能会忽略 &lt;meta&gt; 元素。此外,如果您从多个输入源生成 HTML 页面,结果可能最终会使用多个编码(这当然是个问题)。
  • 这很奇怪...我开始简化代码...现在...一个文件中相同的西里尔字母 9 符号字是 17 个字节(即 html 页面上的矩形),在另一个文件中是 7 个字节。两个文件都显示 9 个西里尔符号,在记事本中看起来相同。记事本显示相同的 1 个单词,没有空格,没有新行。可能吗?据我了解,出于安全原因,我无法在论坛上附加文件...自动检测编码表示它是 Widnows (Cyrillic) 并且仅当它是 Windows (Cyrillic) 时才显示它,但不是 utf-8。什么鬼……
  • @Haradzieniec Notepad 可以处理和自动检测 Unicode(UTF-8 和 UTF-16)和一些 8 位编码,因此 17 字节的字可能使用一些 Unicode 编码,较短的字使用一些 8 位编码。记事本可以识别编码并正确显示文本,尽管使用记事本处理 Unicode 文件很不方便。如果您的浏览器仅在设置为使用“Windows (Cyrillic)”编码时正确显示文本,则证明您确实没有将文件作为 Unicode 提供给浏览器,而是使用了一些 8 位编码。
猜你喜欢
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 2012-04-01
  • 2018-04-22
  • 1970-01-01
相关资源
最近更新 更多