在刮取的HTML中更改奇数(非常高)的ASCII字符

时间:2017-08-14 22:49:29

标签: html ruby nokogiri

我正在处理一些HTML并且它有一些奇怪的字符(当我使用print命令时它会提供换行符)所以我做了以下内容:

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

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

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

这给了我一个错误“Exception:RangeError:9644超出char范围”。

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

或者我可以将ASCII 255上的所有字符更改为“?”,即使我可以知道如何做到这一点也很好。

此致 本

1 个答案:

答案 0 :(得分:0)

怎么样:

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!来修改数组。