如何在Ruby 1.8.7中将Microsoft Office“智能”或“卷曲”引用/撇号转换为ASCII或UTF-8“直线”引用/撇号?

时间:2012-12-28 17:16:56

标签: ruby character-encoding iconv apostrophe ruby-1.8.7

我正在使用(并坚持使用)以下版本的Ruby:

ruby 1.8.7 (2012-06-29 patchlevel 370) [x86_64-linux]

我尝试了很多谷歌搜索,但我无法找到解决问题的方法。我正在导入一个通常来自用户的Microsoft Excel电子表格的CSV文件。我对CSV部分没有任何问题,但我无法弄清楚如何处理MS“智能”报价。我的测试输入文件是DOS格式,包含以下行:

JeanneO 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

这会产生不良输出:

Jeanne ONeill

有没有办法在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
唉,没有爱。它仍然产生相同的结果:(

1 个答案:

答案 0 :(得分:-1)

我在PHP中做到了这一点并且完美无缺。也许你可以尝试Ruby等价物,如果它存在?

$bad_symbols = array('�t', '�s', '�ll', '�ve', '�d', '�re', '� ', ' �');
$replacements_for_bad_symbols = array("\'t", "\'s", "\'ll", "\'ve", "\'d", "\'re", '" ', ' "');
$text = str_replace($bad_symbols, $replacements_for_bad_symbols, $text);

为了说明MySQL的叛逆和逃避,我不得不将我的代码更新为...

stripslashes()