数据库文本中的奇怪字符:Ã,Ã,¢,â€,

Ste*_*eve 26 database character-encoding prestashop

我不确定这是什么时候发生的.

我有一个新的drop-shipping会员网站,并从批发商那里收到产品目录的导出副本.我格式化并将其导入Prestashop 1.4.4.

网站的前端包含产品文本中的奇怪字符组合:Ã,Ã,¢,â等.它们出现在常见字符的位置,如: - :等.

这些字符存在于大约40%的数据库表中,而不仅仅是产品特定的表,如ps_product_lang.

另一个网站线程当数据库连接字符串使用不正确的字符编码类型时会出现同样的问题.

在/config/setting.inc中,没有提到的字符编码字符串,只有MySQL Engine,它设置为InnoDB,与我在PHPMyAdmin中看到的匹配.

我导出了ps_product_lang,用正确的字符替换了这些字符的所有实例,以UTF-8格式保存了CSV文件,并使用PHPMyAdmin重新导入它们,指定UTF-8作为语言.

但是,在PHPMyAdmin中进行新的搜索后,我现在在ps_product_lang中的这些错误字符的实例数量是我开始时的10倍.

如果问题就像在数据库连接字符串中指定正确的语言属性一样简单,我在哪里/如何设置它,以及该怎么做?

我很自然地尝试在此线程中提到的PHPMyAdmin中运行此命令,但问题仍然存在:

SET NAMES utf8
Run Code Online (Sandbox Code Playgroud)

更新:PHPMyAdmin说:

MySQL charset:UTF-8 Unicode(utf8)

这与我在上一个导入文件中使用的字符集相同,导致更多字符损坏.在导入过程中,UTF-8被指定为导入文件的字符集.

UPDATE2

这是一个示例:

人们真正生活在不受限制的地方,在线购买和租借电影,下载软件以及共享和存储文件,这些都是不受欢迎的,••••••â€网络.

UPDATE3

我在PHPMyAdmin中运行了一个SQL命令来显示字符集:

  • character_set_client utf8
  • character_set_connection utf8
  • character_set_database latin1
  • character_set_filesystem二进制文件
  • character_set_results utf8
  • character_set_server latin1
  • character_set_system utf8

因此,我的数据库可能需要转换(或删除并重新创建)为UTF-8.如果MySQL服务器是latin1,这会造成问题吗?

MySQL能否将服务内容的翻译作为UTF8处理,但将其存储为latin1?我不认为它可以,因为UTF8是latin1的超集.我的网络托管支持在48小时内没有回复.对他们来说可能太难了.

Ale*_*exV 17

如果表的charset与它的内容相同,请尝试使用mysql_set_charset('UTF8', $link_identifier).请注意,MySQL用于UTF8指定UTF-8编码,而不是UTF-8更常见的编码.

在类似的问题上检查我的其他答案.


Aur*_*osa 5

这肯定是编码问题.您的数据库和网站中有不同的编码,这是导致问题的原因.此外,如果您运行该命令,则必须更改表中已有的记录以转换UTF-8中的字符.

更新:根据您的上一条评论,问题的核心是您有一个使用不同编码的数据库和数据源(CSV文件).因此,您可以使用UTF-8转换数据库,或者至少在获取CSV中的数据时,必须将它们从UTF-8转换为latin1.

您可以按照以下文章进行转换:


Kri*_*ann 5

这似乎是 UTF-8 编码问题,可能是由数据库文件内容的双重 UTF8 编码引起的。

\n\n

这种情况可能是由于诸如选择或未选择的字符集(例如创建数据库备份文件时)以及保存数据库文件的文件格式和编码等因素而发生的。

\n\n

我在以下场景中看到了这些奇怪的 UTF-8 字符(描述可能不完全准确,因为我无法再访问相关数据库):

\n\n
    \n
  • 我记得,数据库和表有一个“uft8_general_ci”排序规则。
  • \n
  • 备份由数据库组成。
  • \n
  • 备份文件在 Windows 上以 UNIX 文件格式和 ANSI 编码打开。
  • \n
  • 通过将数据库备份文件中的内容复制粘贴到 phpMyAdmin 中,将数据库恢复到新的 MySQL 服务器上。
  • \n
\n\n

查看文件内容:

\n\n
    \n
  • 在文本编辑器中打开SQL备份文件,发现SQL备份文件中有“s\xc3\x83\xc6\x92\xc3\x82\xc2\xa5”等奇怪字符。另外,如果在另一个编辑器中打开同一文件,您可能会得到不同的结果。我在这里使用 TextPad,但在 SublimeText 中打开同一个文件时显示“s\xc3\x83\xc2\xa5”,因为 SublimeText 正确地对文件进行了 UTF8 编码——不过,当您开始尝试在 PHP 中解决问题时,这有点令人困惑因为你一开始在 SublimeText 中没有看到正确的数据。无论如何,可以通过记下文本编辑器在显示文件内容时使用的编码来解决这个问题。
  • \n
  • 奇怪的字符是双重编码的UTF-8字符,所以在我的例子中,第一个“\xc3\x83\xc6\x92”部分等于“\xc3\x83”和“\xc3\x82\xc2\xa5”=“\ xc2\xa5”(这是我的第一个“编码”)。“\xc3\x83\xc2\xa5”字符等于“\xc3\xa5”的 UTF-8 字符(这是我的第二个编码)。
  • \n
\n\n

因此,问题在于“错误”(UTF8 编码两次)utf-8 需要转换回“正确”utf-8(仅 UTF8 编码一次)

\n\n

尝试在 PHP 中解决这个问题有点具有挑战性:

\n\n

utf8_decode() 无法处理字符。

\n\n
// Fails silently (as in - nothing is output)\n$str = "s\xc3\x83\xc6\x92\xc3\x82\xc2\xa5";\n\n$str = utf8_decode($str);\nprintf("\\n%s", $str);\n\n$str = utf8_decode($str);\nprintf("\\n%s", $str);\n
Run Code Online (Sandbox Code Playgroud)\n\n

iconv() 失败并显示“注意: iconv():在输入字符串中检测到非法字符”。

\n\n
echo iconv("UTF-8", "ISO-8859-1", "s\xc3\x83\xc6\x92\xc3\x82\xc2\xa5");\n
Run Code Online (Sandbox Code Playgroud)\n\n

另一个很好且可能的解决方案也会默默地失败

\n\n
$str = "s\xc3\x83\xc6\x92\xc3\x82\xc2\xa5";\necho html_entity_decode(htmlentities($str, ENT_QUOTES, \'UTF-8\'), ENT_QUOTES , \'ISO-8859-15\');\n
Run Code Online (Sandbox Code Playgroud)\n\n

mb_convert_encoding() 默默地: #

\n\n
$str = "s\xc3\x83\xc6\x92\xc3\x82\xc2\xa5";\necho mb_convert_encoding($str, \'ISO-8859-15\', \'UTF-8\');\n// (No output)\n
Run Code Online (Sandbox Code Playgroud)\n\n

尝试通过将 MySQL 数据库字符集和排序规则转换为 UTF-8 来修复 MySQL 中的编码但未成功:

\n\n
ALTER DATABASE myDatabase CHARACTER SET utf8 COLLATE utf8_unicode_ci;\nALTER TABLE myTable CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;\n
Run Code Online (Sandbox Code Playgroud)\n\n

我看到有几种方法可以解决这个问题。

\n\n

首先是使用正确的编码进行备份(编码需要与实际的数据库和表编码相匹配)。您只需在文本编辑器中打开生成的 SQL 文件即可验证编码。

\n\n

另一种是用单UTF8编码字符替换双UTF8编码字符。这可以在文本编辑器中手动完成。为了协助完成此过程,您可以从尝试UTF-8 编码调试图表中手动选择不正确的字符中手动挑选不正确的字符(可能需要替换 5-10 个错误)。

\n\n

最后,脚本可以协助该过程:

\n\n
    $str = "s\xc3\x83\xc6\x92\xc3\x82\xc2\xa5";\n    // The two arrays can also be generated by double-encoding values in the first array and single-encoding values in the second array.\n    $str = str_replace(["\xc3\x83\xc6\x92","\xc3\x82\xc2\xa5"], ["\xc3\x83","\xc2\xa5"], $str); \n    $str = utf8_decode($str);\n    echo $str;\n    // Output: "s\xc3\xa5" (correct)\n
Run Code Online (Sandbox Code Playgroud)\n