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命令来显示字符集:
因此,我的数据库可能需要转换(或删除并重新创建)为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更常见的编码.
在类似的问题上检查我的其他答案.
这肯定是编码问题.您的数据库和网站中有不同的编码,这是导致问题的原因.此外,如果您运行该命令,则必须更改表中已有的记录以转换UTF-8中的字符.
更新:根据您的上一条评论,问题的核心是您有一个使用不同编码的数据库和数据源(CSV文件).因此,您可以使用UTF-8转换数据库,或者至少在获取CSV中的数据时,必须将它们从UTF-8转换为latin1.
您可以按照以下文章进行转换:
这似乎是 UTF-8 编码问题,可能是由数据库文件内容的双重 UTF8 编码引起的。
\n\n这种情况可能是由于诸如选择或未选择的字符集(例如创建数据库备份文件时)以及保存数据库文件的文件格式和编码等因素而发生的。
\n\n我在以下场景中看到了这些奇怪的 UTF-8 字符(描述可能不完全准确,因为我无法再访问相关数据库):
\n\n查看文件内容:
\n\n因此,问题在于“错误”(UTF8 编码两次)utf-8 需要转换回“正确”utf-8(仅 UTF8 编码一次)。
\n\n尝试在 PHP 中解决这个问题有点具有挑战性:
\n\nutf8_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);\nRun Code Online (Sandbox Code Playgroud)\n\niconv() 失败并显示“注意: iconv():在输入字符串中检测到非法字符”。
\n\necho iconv("UTF-8", "ISO-8859-1", "s\xc3\x83\xc6\x92\xc3\x82\xc2\xa5");\nRun 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\');\nRun Code Online (Sandbox Code Playgroud)\n\nmb_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)\nRun Code Online (Sandbox Code Playgroud)\n\n尝试通过将 MySQL 数据库字符集和排序规则转换为 UTF-8 来修复 MySQL 中的编码但未成功:
\n\nALTER DATABASE myDatabase CHARACTER SET utf8 COLLATE utf8_unicode_ci;\nALTER TABLE myTable CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;\nRun 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)\nRun Code Online (Sandbox Code Playgroud)\n