【问题标题】:sanitizing content from open(url).read清理来自 open(url).read 的内容
【发布时间】:2011-09-30 22:11:51
【问题描述】:

我正在使用 Ruby 打开一个 URL 并读取其内容。我正在阅读的文件的内容类型是“文本/纯文本”。

问题是它包含一些我想转义的字符。例如,纯文本中出现的字符之一是“\240”,它是连字符的 ASCII。

我很好奇这是如何生成的,因为我在文本中的任何地方都看不到连字符。然而它是不可见的,当我使用puts 在控制台中打印文本时,会出现“\240”。

其次,我该如何避免这种奇怪的字符实例?理想情况下,我想转义所有形式为“\ [某个数字]”的字符。我正在使用

"\240".gsub(Regexp.new("\\\d+"),"")

但它似乎不起作用。

是否有更传统的方法来清理从打开 URL 读取的纯文本内容?

【问题讨论】:

  • 连字符不是“\240”。连字符是低位 ASCII 字符 45.chr #=> "-"。您看到的是高位字符。
  • 你是如何打开网址的?显示 URL 和一些示例代码。 Net::HTTP 和 Open::URI 都可以让您查看内容编码,以了解服务器认为文档是什么字符集。问题是服务器可能是错误的,但这是您的起点。您可以发出HEAD 请求来查找编码,然后告诉Ruby 在您收到实际正文时使用它。这应该有助于避免被误解的字符。

标签: ruby text sanitization


【解决方案1】:

在玩了这个之后,我发现以下正则表达式对我有用:

str.gsub(/[^\x00-\x7F]/,'')

【讨论】:

    【解决方案2】:

    您可能想要检查返回的文本的字符集。它可能是 UTF-8,它经常有这么高的字符。 Ruby 1.9 对字符集和它们之间的切换有很好的支持。我使用str.encode("US-ASCII", :invalid => :replace, :undef => :replace, :replace => "?") 将字符串强制转换为标准ASCII,用? 替换任何奇数字符。

    【讨论】:

    • 我喜欢这个答案,并计划在迁移到 Ruby 1.9 后使用这种方法。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 2015-01-16
    相关资源
    最近更新 更多