2011-09-29 46 views
1

我在數據庫中有一個像\ 303 \ 255這樣的字符串,代表í。Ruby字符串表示

我該如何轉換8字符表示法?

我可以全部替換它們,但是沒有其他方法嗎?

+0

有什麼編碼? UTF-8? –

+0

是的,編碼是UTF-8 – kaydara

+0

你的意思是你有字符串:'str =「\」\\ 303 \\ 255 \「」'(即斜槓真的*在字符串中?)。如果有的話,你必須將它們提取出來並將它們'Array#pack'打包成真實的字符。 – d11wtq

回答

0

假設問題真的是象你所說的,不只是一個誤會。

我爲此付出了努力。這並不漂亮。這解析字符串並使用pack打包相關字節。

"foo \\303\\255 bar".gsub(/(\\\d{3})+/) do |match| 
    match[1..-1].split("\\").map{ |octet| octet.to_i(8) }.pack("c*") 
end.force_encoding("UTF-8") 

短得多的版本使用eval,但它總是值得嘗試,以避免eval如果可以的話,因爲如果使用不當,它有巨大的安全隱患。鑑於我們正在驗證我們eval「荷蘭國際集團在這裏是什麼,我會繼續前進,說這可能是安全做到這一點的格式:

"foo \\303\\255 bar".gsub(/(\\\d{3})+/) { |m| eval('"' + m + '"') } 
+0

eval正在工作!將檢查爲什麼第一個操作系統無法正常工作......非常感謝! :D – kaydara

+0

確保你只評估你知道安全的字符串,否則(如果你可能發現自己陷入混亂)。我的代碼是可以的,但是「評估」整個字符串,雖然它可能會工作,但是會很危險。 – d11wtq

+0

這是內部和私人數據轉換,所以可以使用eval來實現,但是感謝您的警告! – kaydara

1

它不是字符串中真正的8個字符,而是2個字節。我不知道你想要\ 303 \ 255展現出來,因爲我,但如果你把

# encoding: utf-8 

在你的.rb文件的頂部紅寶石將使用UTF-8。

如果您在使用Ruby on Rails,你可以嘗試添加以下兩行到config/environment.rb

Encoding.default_external = Encoding::UTF_8 
Encoding.default_internal = Encoding::UTF_8 
+0

上面的編碼沒有工作,eval做了,謝謝Jonas – kaydara