【问题标题】:Very strange behaviour with UTF-8 [duplicate]UTF-8 的非常奇怪的行为 [重复]
【发布时间】:2015-11-25 00:20:25
【问题描述】:

如何将 sql 文本字段回显到段落中?

我的代码确实将文本放入其中,但将 á 之类的重音符号更改为 -> 。 我尝试在标题中添加 UTF-8 并将其删除。

去掉 UTF-A 使得 sql 内容还可以,但是段外的内容都乱了。

我检查了数据库使用的是 (UTF-8-unicode),文件是用 UTF-8 保存的

有什么想法可能是错的吗?

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

<textarea class="texto" name="textoarticulo"  id="textoarticulo" form="formarticulo" placeholder="Texto del art&iacute;culo...">
 <?
    echo $row['txt4'];

 ?>
</textarea>

【问题讨论】:

标签: php encoding utf-8


【解决方案1】:

您的整个代码必须具有相同的字符集以避免字符显示不正确的问题。

这里列出了一些必须设置为特定字符集的内容。

标题

  • 将 HTML 和 PHP 标头中的字符集设置为 UTF-8

    • PHP(PHP 标头必须放在 任何 输出之前:PHP 回显、空白、HTML!):

      header('Content-Type: text/html; charset=utf-8');
      
    • HTML (HTML-headers 放在 &lt;head&gt; / &lt;/head&gt; 标签内)

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

连接

  • 您还需要在连接本身中指定字符集。

    • PDO(在对象本身中指定):

      $handler = new PDO('mysql:host=localhost;dbname=database;charset=utf8', 'username', 'password');
      
    • MySQLi:(创建连接后直接放置,$mysqli为连接对象)

      $mysqli->set_charset("utf8"); // OOP style
      mysqli_set_charset($mysqli, "utf8"); // procedural style
      
    • MySQL(deprericated):(创建连接后直接放置)

      mysql_set_charset("utf8");
      

数据库

  • 您的数据库 及其表必须设置为 UTF-8。请注意,字符集与排序规则相同。

    您可以通过对每个数据库和表运行一次以下查询来做到这一点(例如在 phpMyAdmin 中)

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    

    注意... 有各种不同的情况需要不同的ALTERsDetails Here 。做错ALTER 可能会使事情变得更糟。 ——里克·詹姆斯

php.ini 规范

  • 在您的php.ini 文件中,您应该为您的平台指定默认字符集,如下所示

    default_charset = "utf-8";
    

    (这本质上与在所有页面上执行header('Content-Type: text/html; charset=utf-8'); 相同)

文件编码

  • .php 文件本身采用 UTF-8 编码也很重要。如果您使用 Notepad++ 编写代码,可以在任务栏上的“格式”下拉菜单中完成。您应该使用不带 BOM 的 UTF-8。

如果您遵循上述所有指示,您的问题很可能会得到解决。如果没有,您可以查看这篇 StackOverflow 帖子:UTF-8 all the way through

【讨论】:

  • 非常感谢,在数据库连接上指定字符集成功了!
  • 幸好它解决了您的问题!尽管如此,应该应用所有这些步骤以确保您的代码具有正确的字符集。 :)
  • 警告:ALTERs 可能会进一步损坏存储的数据。需要更多分析来决定是使用它们还是“两步改变”。
  • @RickJames 非常正确,虽然答案是为了干净/新鲜的设置 - 也许它应该更清楚。如果您认为可以改进,请随时编辑答案。
  • 我在您的回答中添加了“注意...”。它包括指向各种案例的链接。
猜你喜欢
  • 1970-01-01
  • 2011-08-08
  • 2011-04-08
  • 1970-01-01
  • 2016-03-13
  • 2011-03-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多