[英]Ruby: Convert encoded character to actual UTF-8 character
Ruby 不會很好地處理 UTF-8 字符串。 我在 XML 文件中傳遞數據,雖然 XML 文檔被指定為 UTF-8,但它將 ascii 編碼(每個字符兩個字節)視為單個字符。
我已經開始以 '\\uXXXX' 格式對輸入字符串進行編碼,但是我不知道如何將其轉換為實際的 UTF-8 字符。 我一直在這個網站和谷歌上搜索,但無濟於事,我現在非常沮喪。 我正在使用 Ruby 1.8.6
基本上,我想轉換字符串 '\Σ' -> "Σ"。
我所擁有的是:
data.gsub /\\u([a-zA-Z0-9]{4})/, $1.hex.to_i.chr
這當然會給出“931 超出字符范圍”的錯誤。
謝謝蒂姆
試試這個 :
[0x50].pack("U")
其中0x50
是 utf8 字符的十六進制代碼。
是否因為 Ruby 字符串將 UTF-8 編碼的代碼點視為兩個字符而中斷? 如果沒有,那么你不應該太擔心。 如果出現問題,請添加評論讓我們知道。 解決這個問題可能比尋找解決方法更好。
如果您需要進行轉換,請查看 Iconv 庫。
無論如何, Σ
可能是\Σ
更好的替代品。 \\uXXXX 在 JSON 中使用,但不在 XML 中使用。 如果您想解析 \\uXXXX 格式,請查看一些 JSON 庫是如何做的。
Ruby(至少 1.8.6)沒有完整的 Unicode 支持。 Integer#chr
僅支持 ASCII 字符,否則最多只能支持255
八進制表示法 ( '\\377'
)。
證明:
irb(main):001:0> 255.chr
=> "\377"
irb(main):002:0> 256.chr
RangeError: 256 out of char range
from (irb):2:in `chr'
from (irb):2
您可以嘗試升級到 Ruby 1.9。 chr
文檔沒有明確說明 ASCII,因此支持可能已經擴展——盡管示例在 255 處停止。
或者,您可以嘗試調查ruby-unicode 。 我自己從來沒有嘗試過,所以我不知道它會有多大幫助。
否則,我認為您目前無法在 Ruby 中做您想做的事。
您可以將編碼傳遞給Integer#chr
:
chr([編碼]) → 字符串
根據
encoding
返回一個包含由int
值表示的字符的字符串。65.chr #=> "A" 230.chr #=> "\\xE6" 255.chr(Encoding::UTF_8) #=> "\ÿ"
因此,不要使用.chr
,而是使用.chr(Encoding::UTF_8)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.