簡體   English   中英

Ruby:將編碼字符轉換為實際的 UTF-8 字符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM