【问题标题】:How do I write the £ (GBP) sign in a CSV file from Ruby and read it back correctly in Excel?如何在 Ruby 的 CSV 文件中写入 £ (GBP) 符号并在 Excel 中正确读取?
【发布时间】:2020-04-12 23:14:14
【问题描述】:

当我使用 Ruby 编写包含 £ 符号的 CSV 文件并使用 Excel 打开它时,我看到的是这个符号而不是 ¬£

我的理解是 Ruby 使用 UTF-8,但 Excel 使用不同的编码 (ASCII) 解释此文件。

我尝试像这样编写一个 US-ASCII 编码的 CSV 文件 and guessed the £ encoding in ASCII

csv = CSV.open(filename, 'w:US-ASCII')
csv << "\xA3"
csv.close

但它在 CSV 库深处的某处出现 invalid byte sequence in UTF-8 失败。

我做错了什么?
谢谢

【问题讨论】:

  • £ 不是您在发送的链接中看到的US-ASCII。检查stackoverflow.com/questions/7047944/…
  • 谢谢贾科莫。但如果是这种情况,Excel 在读取时使用什么符号和编码?
  • 我想说的一点:使用ISO8859-1作为编码。阅读和写作有很大的对称性。从一个你了解另一个。
  • 谢谢Giacomo,我试试看!
  • IIRC,Excel 在 UTF-8 CSV 文件前加上 BOM。您可以尝试一下,看看它是否使导入更容易。

标签: excel ruby encoding utf-8 ascii


【解决方案1】:

当然,Excel 不一定要使用 ASCII。例如,我可以轻松地将日文字符输入到 Excel 单元格中,而这些字符肯定不能用 ASCII 表示。

虽然默认情况下 Ruby 在其内部表示中使用 Unicode,但每个 String 对象都包含自己的编码,因此理论上您可以根据需要混合使用不同编码的字符串。在您的情况下,您希望在写入文件时强制使用某种编码。这可以通过使用w: 输出选项(如您所做的那样)或使用external_encoding: Encoding::US-ASCII 来完成。 Encoding 中的常量名称请参见 here

我不认为 US-ASCII 是编码的好选择,因为ASCII chart 中没有井号。我原以为您在尝试编写英镑符号时会在 stderr 上收到警告消息。如果您需要 8 位编码,ISO-8859-1 应该可以完成这项工作,但我的建议是编写 UTF-8 和 tell Excel to use this encoding when reading the CSV file。至少从 Excel 2007 开始就存在导入 UTF 的可能性。

【讨论】:

  • 谢谢。有什么方法可以在不需要用户干预的情况下通知 Excel 使用哪种编码?
  • @mottalrd : 用户如何使用 Excel 读取文件?如果他启动 Excel 然后导入 CSV,这已经用户干预。还是您想从命令行启动 Excel,并实际自动打开文件?
  • 感谢您的检查。在我的情况下,用户只是双击 Excel,他们没有明确导入它。我现在通过以 ISO 格式编写文件来解决。谢谢!
  • 您的意思是:双击代表 Excel 应用程序链接的图标?那么他如何选择要读取的 CSV 文件呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多