ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
Amazon 解决下载文件乱码 大家在做多个站点的时候,可能会遇到下载下来的报告文件出现乱码。 法国站点和意大利站点均会出现这样的情况,那怎么解决呢? 这是由于编码的问题而导致,在我们读取数据插入到本地数据库的时候,不妨先将格式转成对应国家能正确识别的格式。 在文档中也有看到。 ![](https://img.kancloud.cn/0e/05/0e05d06612ce417c1a8386eb5bf5cf05_1899x768.png) 还要一个问题需要说明,由于操作系统设置默认语言的原因,在小国家站点,我们下载下来的报告可能会出现乱码的情况。这种情况很正常,在调用接口的时候,也没有办法去解决直接下载就出现正常编码。 现在的方法是将下载下来的乱码文件,通过流操作,重新编码,根据上图对应的编码来设置编码。 文章来自[https://www.cnblogs.com/yangda/p/3963220.html](https://www.cnblogs.com/yangda/p/3963220.html) 以下已验证可行 ``` # 检测编码,未检测到用市场指定的编码转utf8;检测出来,用检测的编码转utf8;如果是utf8,则不作处理 // $encode = mb_detect_encoding($result, array("UTF-8",'iso-8859-1',"Shift_JIS","cp1252",'UTF-16')); $encode = mb_detect_encoding($result); if($encode == false){ $marketplaceId = $this->config['Marketplace_Id']; if(in_array($marketplaceId, $this->market_EU) || in_array($marketplaceId, $this->market_US)){ $result = mb_convert_encoding($result, "UTF-8", ["iso-8859-1", "cp1252"]); }else if(in_array($marketplaceId, $this->market_JP)){ $result = mb_convert_encoding($result, 'UTF-8', ["Shift_JIS"]); }else if(in_array($marketplaceId, $this->market_CN)){ $result = mb_convert_encoding($result, 'UTF-8', ["UTF-8", "UTF-16"]); }else{ $result = mb_convert_encoding($result, "UTF-8", ["cp1252"]); } }else if($encode != 'UTF-8'){ $result = mb_convert_encoding($result, "UTF-8", $encode); } private $market_US = [ 'ATVPDKIKX0DER', 'A1AM78C64UM0Y8', 'A2EUQ1WTGCTBG2', 'A21TJRUUN4KGV', 'A2Q3Y263D00KWC', 'A39IBJ37TRP1C6', ]; private $market_EU = [ 'A1PA6795UKMFR9', 'A1RKKUPIHCS9HS', 'A13V1IB3VIYZZH', ]; private $market_JP = [ 'A1VC38T7YXB528' ]; private $market_CN = [ 'AAHKV2X7AFYLW' ]; ``` ``` <?php namespace App\Service\Amazon; class MarketplaceId { # North America region const BR = 'A2Q3Y263D00KWC'; # 巴西 const CA = 'A2EUQ1WTGCTBG2'; # 加拿大 const MX = 'A1AM78C64UM0Y8'; # 墨西哥 const US = 'ATVPDKIKX0DER'; # 美国 # Europe region const AE = 'A2VIGQ35RCS4UG'; # 阿联酋 const DE = 'A1PA6795UKMFR9'; # 德国 const EG = 'ARBP9OOSHTCHU'; # 埃及 const ES = 'A1RKKUPIHCS9HS'; # 西班牙 const FR = 'A13V1IB3VIYZZH'; # 法国 const GB = 'A1F83G8C2ARO7P'; # 英国 const IN = 'A21TJRUUN4KGV'; # 印度 const IT = 'APJ6JRA9NG5V4'; # 意大利 const SA = 'A17E79C6D8DWNP'; # 沙特阿拉伯 const TR = 'A33AVAJ2PDY3EV'; # 土耳其 # Far East region const SG = 'A19VAU5U5O7RUS'; # 新加坡 const AU = 'A39IBJ37TRP1C6'; # 澳大利亚 const JP = 'A1VC38T7YXB528'; # 日本 const CN = 'AAHKV2X7AFYLW'; # 中国 } ``` 后续更新: 实际上出现了检测出编码为ISO-8859-1,最后转码还是乱码。该$result写入xls文件,双击打开日文显示正常。 后面发现,我改变该检测字符编码函数的第三个参数,结果却各不相同: `$encode = mb_detect_encoding($result, array("UTF-8",'iso-8859-1',"Shift_JIS","cp1252",'UTF-16')); ` `$encode = mb_detect_encoding($result, array("UTF-8",'Shift_JIS',"iso-8859-1","cp1252",'UTF-16')); ` `$encode = mb_detect_encoding($result); ` 同一个字符串三个返回结果都不一样。分别为: ISO-8859-1 SJIS false 这个检测编码的函数可能存在问题,需要后续深入研究。 但是,第二和第三的结果分别会构成 `$result = mb_convert_encoding($result, 'UTF-8', 'SJIS');` 和 `$result = mb_convert_encoding($result, 'UTF-8', 'Shift_JIS');` 逻辑。 都会正常转换成日文。 我的猜想是: mb_convert_encoding并不是一个严格函数,在第三个参数【待检测的字符编码列表】给出的情况下,他会按顺序检测字符特性的符合度,达不到,按给出列表的顺序逐个匹配,达到一定符合度就直接返回匹配的编码,后续不再检测。 所以,在一个字符串的字符特性与多个编码的匹配度满足符合度的情况下,谁排在前面就return谁。所以出现了第一和第二的不同编码返回。 所以我这里建议是,如果已知目标字符串是哪国编码,指定转换即可,或者在mb_detect_encoding的检测列表将该国编码或者可能性按大小依次排列 对于你这个问题,既然已知日文,直接`mb_convert_encoding($result, 'UTF-8', 'Shift_JIS');`试试。