【问题标题】:Problems with the output of icons in a mysql database stored textmysql数据库存储文本中图标输出的问题
【发布时间】:2022-01-20 07:08:31
【问题描述】:

我在通过 php(在线 - PHP 版本 7.3.23)从 mysql 数据库 (InnoDB DEFAULT CHARSET=utf8) 输出文本中的图标时遇到问题。

这样的文字:

Alles gut✅✅✅

在 phpMyadmin 视图(离线和在线)中,它们正确显示给我。我在本地服务器(Apache)上的离线脚本(PHP 版本 7.4.24)中阅读它们也没有问题,以便向我显示它们。在线使用几乎相同的脚本,我只会将图片显示为问号。 有趣的是,我必须使用 utf8_encode 在线编辑文本。离线它只是在没有它的情况下向我展示其他特殊字符。这绝对是脚本现在在线和离线唯一不同的地方。 我在网上做错了什么?

有谁知道该怎么做,可以给我小费吗? 我需要考虑什么?有没有安全的输出方式?

【问题讨论】:

  • 这能回答你的问题吗? How to store Emoji Character in MySQL Database
  • 感谢您的快速反应。在数据库中,图标被正确存储,就像它看起来的那样。 (本地和在线的phpMyAdmin输出都没有问题)我需要自己的PHP输出脚本的解决方案。事情是正确的输出,而不是我猜的输入。

标签: php database utf-8


【解决方案1】:

当您“在线”查看页面时,您正在通过 HTTP 加载页面;除此之外,您的脚本可能会输出 HTML 而不是纯文本 (?)。不清楚。

无论哪种方式,HTTP 都会在混合中添加 1 个额外的文本编码层(使用 F12 -> Network tab -> Refresh the page 检查浏览器工具中的 HTTP 标头)。 HTML 添加了另外几层,主要在<head> 部分。在这两种情况下,您都想查看是否提到了任何(文本/字符)编码,如果不是UTF-8(如您的数据库),例如UTF-16ISO-8859-1,那么这可能是你的问题。

另一种可能性是,自从从 MySQL 检索文本以来,您已经以非多字节方式处理文本。不幸的是,PHP 仍然有很多这样的功能。例如,如果您使用 substr() 而不是 mb_substr()。您可以通过在从数据库检索到字符串值之后(在进行任何操作或连接等之前)直接打印字符串值来排除这种可能性。

另一种选择可能是您实际上是在描述字体问题而不是编码问题。不同的字体支持不同的 unicode 段,所以这也可能是您的问题。 PHPMyAdmin 可能使用的字体与您的网页不同。

第四个选项与数据库连接有关(在 php 中)。数据库在多个级别定义字符编码的类型:每个数据库单独选择一个 charset*、每个表、每个 char/varchar/text 字段;但是(更相关地),每个 connection 都有自己的编码。在您的 mysqli_connect/PDO::connect 样式函数中,您可以选择另一个字符集。

* = 正如您已经确定的那样,问题不可能出在数据库本身。

第五个选项与第四个基本相同:您的数据库服务器可能将错误的字符集定义为每个连接的默认值。在这种情况下,可能是 phpmyadmin 定义了自己的每个连接字符集(从而推翻了 mysql 默认值),但是您自己的网站没有手动选择一个,因此得到了错误的默认值。这个选项似乎最不可能,但在技术上是可行的。

【讨论】:

  • 感谢您的有趣回答。但问题还在于它使用几乎相同的脚本在本地工作。所以也许我的意思是 MySQL 和 PHP 之间的通信。文本仅使用 str_replace 输出。它在本地工作。有趣的是,我必须使用 utf8_encode 在线编辑文本。离线它只是在没有它的情况下向我展示其他特殊字符!这绝对是现在脚本在线和离线唯一不同的地方。
  • 你能显示相关的脚本代码吗? (主要围绕 connect() 和 query() 语句,以及您操作或打印/回显包含此图标的列的任何行);或者如果您不关心保密,请发布网址; -- 您必须在一种情况下使用 utf8_encode 而在另一种情况下不使用这一事实表明问题可能与编码有关。
  • while($row = $result -> fetch()) { $string .= str_replace('\\','',utf8_encode($row['col'])); } 回声 $string; utf8_encode() 只能在线使用。
  • 最好使用代码{}按钮/标记将其编辑到您的原始问题中。你的一半代码在这里被吃掉了:) 如果可以的话,还可以添加 db connect 语句
  • str_replace() 看起来是一个可能的原因,但是您必须在该位置使用 utf8_encode 的事实(如果您确实必须),实际上表明问题出在每个连接上字符集。因为您在 fetch()ing UTF8 数据库表中的数据之后立即进行 iso->utf8 转换,只有在转换为 iso8859 时才需要一路上
【解决方案2】:

当我问的时候,我曾经带着它们。尽管输出特殊字符没有任何问题,但这里肯定缺少它。 这显然是解决方案。

$ db-> exec("set names utf8");

它肯定只适用于这条线。 也许还有其他选择。 非常感谢您的回答。我可能会仔细研究所有这些。

我唯一要理解的问题是它背后是哪个 Unicode 或 Html 实体。因为它们以黑白而不是彩色显示给我,例如在 PDF 中。对于一些我在那里交换了一张照片。但我无法从代码中读取其他内容。总是有生成的图像或问号。

【讨论】:

  • 是的,我认为必须如此,在 connect() 期间或之后使用单独的 SET 语句定义正确的字符集并不罕见,就像您在此处所做的那样。跨度>
猜你喜欢
  • 2012-01-30
  • 1970-01-01
  • 2011-10-29
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多