更改已抓取的奇数(非常高)ASCII 字符 HTML

Changing odd (very high) ASCII chars in scraped HTML

我正在处理一些 HTML 并且它有一些奇怪的字符(当我使用打印命令时会换行)所以我做了以下操作:

d.each_char do |c|; puts c + " " + c.ord.to_s; end

我发现是个9644的字符,好像是Unicode黑色矩形。还有一个 ASCII 219 看起来很相似,所以我想将它映射到这个 ASCII 码。我试过了:

d = d.gsub( 9644.chr, 219.chr) 

这给了我一个错误 "Exception: RangeError: 9644 out of char range"。

有什么方法可以做到这一点(即将所有 ord.9644 更改为 ord.219。

或者,我是否可以将 ASCII 255 上的所有字符更改为“?”,即使我可以,最好知道如何执行此操作。

此致, 本

怎么样:

d.chars.map(&:ord).map { |int| int == 9644 ? 219 : int }.map(&:chr).join

如果您只想用 ? 替换所有高值,请改用:

high_limit = 999 # Use whatever integer your `#chr` method can handle
d.chars.map(&:ord).map { |int| int > high_limit ? 255 : int }.map(&:chr).join

#chars 方法将字符串分解为单个字符数组,然后 map(&:ord) 将其转换为表示 UTF-8 代码的整数数组。带有条件块的 map 将每次出现的 9644 替换为 219,并保持其他整数不变。最后,我们使用 map(&:chr) 将整数映射回单个字符,然后将生成的字符数组连接回字符串。

请注意,此代码沿途创建了几个数组,每个数组的大小都等于原始字符串的长度,因此在非常大的字符串上使用它可能会消耗大量内存。如果是这种情况,您可以考虑将 map 替换为 map! 以就地修改数组。