我正在处理一些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上的所有字符更改为“?”,即使我可以知道如何做到这一点也很好。
此致 本
答案 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!
来修改数组。