2017-08-14 33 views
0

改變奇數(非常高)ASCII字符我處理一些HTML,它有一些奇怪的字符(這給換行,當我使用print命令),所以我做了以下內容:在刮HTML

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 out of char range」。

有什麼辦法,我可以做到這一點(即改變所有ord.9644到ord.219。

或者可以更改所有字符的ASCII超過255「?」,即使我可以這將是很好要知道如何做到這一點

問候, 本

+0

爲什麼你需要更換角色? – Stefan

+0

[ASCII](https://en.wikipedia.org/wiki/ASCII)是7位字符與碼點0-127設置。還有[擴展ASCII](https://en.wikipedia.org/wiki/Extended_ASCII),其是關於各種8位編碼,即ASCII碼點加128-255的涵蓋性術語。請指定您指的是哪種編碼。 – Stefan

+0

您需要知道HTML文檔的編碼。它可能有一個元字符集標記,或者如果通過HTTP傳遞的話,它可以包含一個Content-Type標題,該標題說明要使用哪種編碼。無論如何,你必須用它所寫的編碼讀取它。如果您沒有被明確告知或通過規範,慣例或其他方式告知,那就是數據丟失。 –

回答

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用219代替9644的每個出現,並保持其他整數不變。最後,我們用map(&:chr)將整數映射回單個字符,然後將結果字符數組連接回字符串。

注意,該代碼創建沿途幾個陣列,其中的每一個在大小上的原始字符串的長度相等,因此,使用它在非常大的字符串可能消耗的存儲器相當數量。如果是這種情況,你可以考慮用map!替換map來修改陣列。

+0

很好,但恐怕它仍然給出了一個錯誤,「異常:引發RangeError:8220出焦範圍」;( –

+0

有趣的,我能做到8220.chr沒有錯誤,你用的是什麼版本的Ruby在。?任何情況下,我會擴大的答案,包括一個版本,這將改變高值255爲您在上面建議。 – moveson

+0

紅寶石2.3.1p112(2016年4月26日)[x86_64的Linux的GNU的。 –