【发布时间】:2012-12-28 17:16:55
【问题描述】:
我正在使用(并坚持使用)以下版本的 Ruby:
ruby 1.8.7 (2012-06-29 patchlevel 370) [x86_64-linux]
我尝试了很多谷歌搜索,但我找不到我的问题的有效答案。我正在导入一个 CSV 文件,该文件通常来自用户的 Microsoft Excel 电子表格。我对 CSV 部分没有任何问题,但我不知道如何处理 MS“智能”引号。我的测试输入文件是 DOS 格式并包含以下行:
珍妮·奥尼尔
在 O'Neill 的 O 和 N 之间有一个 MS 大撇号,在我的文本编辑器中显示为“问号菱形”。当我尝试以下代码时,大撇号被删除:
# replace Microsoft Office 'smart' quotes
# gem to detect character encoding
require 'rchardet'
if name != nil
cd = CharDet.detect(name)
encoding = cd['encoding']
name = Iconv.conv('UTF-8//TRANSLIT', encoding, name)
end
这会产生不希望的输出:
珍妮·奥尼尔
有没有办法在 Ruby 1.8.7 中编写一个正则表达式来检测卷曲的 MS 字符并用直的字符替换它们?我试过在我的正则表达式中使用十六进制代码,但我不能让它们工作。我知道 Ruby 1.8.7 在处理 1.9 的字符编码方面受到更多限制,但我坚持使用它。目前无法在此项目中升级 Ruby。
任何帮助将不胜感激。谢谢。
阅读 TinMan 建议的帖子后,我尝试使用 gsub 替换生成的 '�' 子字符串:
if name != nil
name = Iconv.conv("UTF-8", "cp1252//TRANSLIT", name)
name.gsub(/\u00ef\u00bf\u00bd/u, "'")
end
唉,没有爱。它仍然产生相同的结果:(
【问题讨论】:
-
我得到一个 ? OSX 上的钻石也是如此。这是一个奇怪的角色。
-
您为什么不向我们展示您为在正则表达式中使用十六进制代码而编写的代码?修复你的代码比我们编写全新的、不相关的代码要好得多,而且你必须再次重写它来合并它。
-
我会发布有问题的正则表达式以表明我已经完成了我的尽职调查,但我从 github 删除了它,因为它不起作用。欢迎使用单个正则表达式(或制作一个提示)来替换我的
name变量中的卷曲撇号,并且几乎不需要返工。相关帖子看起来会起作用,但事实并非如此。从命令行,iconv -f "cp1252//translit" -t "utf-8" test/fixtures/files/NAME_field_examples.csv将“Jeanne O�Neill”变成“Jeanne O�Neill”
标签: ruby character-encoding iconv apostrophe ruby-1.8.7