使用Ruby解码亚马逊SP-API的CP932格式日本站点报告
亚马逊SP-API日本站CP932编码报告解析解决方案
核心思路:先将ASCII-8BIT二进制字节串正确转换为对应编码的字符串,再进行解析,避免编码混乱导致的乱码或格式错误。
一、CSV报告解析修正
问题根源
原代码先处理字符串再调整编码,导致字节序列被破坏;手动拆分制表符和换行的操作容易引入格式错误,且未指定CSV的制表符分隔规则。
修正代码
data = AmzSpApi.inflate_document(content, report_document) # 1. 将二进制字节串强制转为CP932编码,再转成UTF-8(可选,方便后续统一处理) # 用invalid/undef参数替换无效字节,避免解析报错 cp932_string = data.force_encoding('CP932').encode('UTF-8', invalid: :replace, undef: :replace) # 2. 直接解析制表符分隔的CSV,指定col_sep为\t csv = CSV.parse(cp932_string, headers: true, col_sep: "\t")
如果不需要转UTF-8,也可以直接用CP932编码解析:
data = AmzSpApi.inflate_document(content, report_document) cp932_string = data.force_encoding('CP932') csv = CSV.parse(cp932_string, headers: true, col_sep: "\t", encoding: 'CP932')
二、XML报告解析修正
问题根源
直接传入ASCII-8BIT字节串时,Nokogiri无法自动识别CP932编码,导致解析不完整。
修正代码
方法1:先转编码再解析
data = AmzSpApi.inflate_document(content, report_document) # 转换为CP932编码后转UTF-8,确保Nokogiri能正确识别文本 cp932_string = data.force_encoding('CP932').encode('UTF-8', invalid: :replace, undef: :replace) parsed_xml = Nokogiri::XML(cp932_string)
方法2:指定Nokogiri解析编码
data = AmzSpApi.inflate_document(content, report_document) parsed_xml = Nokogiri::XML(data) do |config| config.options = Nokogiri::XML::ParseOptions::NOERROR # 忽略编码警告 config.encoding = 'CP932' # 强制指定解析编码 end
通用优化(适配多站点)
可根据报告所属站点动态选择编码,避免硬编码:
# 根据report_metadata或请求参数判断是否为日本站 is_japan_site = true # 替换为实际判断逻辑 target_encoding = is_japan_site ? 'CP932' : 'UTF-8' # CSV通用处理 data = AmzSpApi.inflate_document(content, report_document) encoded_string = data.force_encoding(target_encoding).encode('UTF-8', invalid: :replace, undef: :replace) csv = CSV.parse(encoded_string, headers: true, col_sep: "\t") # XML通用处理 parsed_xml = Nokogiri::XML(encoded_string)
内容的提问来源于stack exchange,提问作者phil
相关产品推荐
相关产品推荐

