2011-08-10 11 views
0

我正在使用Ruby 1.8.7(並且不提供升級)。我想創建一個從0到127的所有UTF-8代碼點的字符串,寫成「\ uXXXX」。使用變量在Ruby中進行UTF-8編碼

我的問題是,這被解釋爲(例如):'u0008'。如果我嘗試使用'\ u0008',字符串變成「\ u0008」,這不是我想要的。

我已經嘗試了許多不同的方式,但似乎不可能創建一個完全只是「\ uXXXX」的字符串即ie。 「\ u000B」。它始終是「\ u000B」或「u000B」

轉義'\'不是一個選項。我需要發送一個字符串到服務器,例如服務器將收到'\ u000B'。這樣其他服務器可以測試它對\ uXXXX語法的解析。然而,這在Ruby中似乎不可行。

高興,如果有人能證明我錯了:)

+0

只是爲了表明這一點:從0到127的UTF-8碼點的精確相同ASCII。你不需要經過複雜的步驟來創建它們。 – deceze

+0

你想要什麼樣的預期結果?請提供您正在查找的數據的樣本。 – Casper

+0

爲了澄清,我真正期望的是價值,例如:「U + 1 = \ u0001,十六進制= \ x01,U + 117 = \ u0075,十六進制= \ x75」 – Robin

回答

2

使用Integer #chr得到的字符。這裏有一個乾淨的版本:

(1..127).each do |i| 
    value << "U+#{i} = #{i.chr}, hex = \\x#{"%02x" % i}; " 
end 

"%02x" % i是等於sprintf("%02x", i)。它以2位十六進制數字的形式返回整數。

轉義輸出(見註釋):

(1..127).each do |i| 
    value << "U+#{i} = \\u#{"%04x" % i}, hex = \\x#{"%02x" % i}; " 
end 
+0

是的。我想補充一點,對於小於128的代碼點,ASCII和UTF-8是相同的,所以不需要擔心Unicode或Ruby 1.9.2。 –

+0

爲了澄清,我真正期望的是價值,例如:「U + 1 = \ u0001,十六進制= \ x01,U + 117 = \ u0075,十六進制= \ x75」。上面給我的是「U + 1 = \ 0001,十六進制= \\ x01,U + 117 = \ 0075,十六進制= \\ x75」,這不是我想要的。我需要\ u因爲我需要字符串被JSON轉義。 – Robin

+0

此外,爲了補充說明,我不能使用「\ x」<< str,因爲我收到了有關無效轉義字符序列的警告。但如果我使用'\ x'<< str,我得到\\ x並且字符串沒有被正確地轉換爲十六進制 – Robin