2017-04-17 68 views
0

我通過活動記錄從postgres數據庫獲取字符串,並且需要將其轉換爲UTF-8代碼列表。將字符串轉換爲Ruby on Rails中的UTF-8代碼列表

我從數據庫中獲取的代碼是波斯語字符,所以它應該看起來像一個阿拉伯字符。

def convertHex 

    @user=DoctorProfile.where(id: params[:id]) 
    # [email protected](:first_name) 
    ar=Array.new 
    pri=Array.new 
    [email protected](:first_name) 
    ar.split(",").map { |s| s.to_s } 

    ar.each do |p| 
    pri.push(p.ord.to_s + " , ") 
    end 

    # [email protected]("") 
    # ar = ar.each_byte.map { |b| b.to\_s(16) }.join 
    #ar.each do |c| 
    # b=b +','+ c 
    #end 

    render json: pri ,status:200 
end 

我得到這個

[ 
    "1590 , " 
] 

但我想是這樣的:

[ 
    "1590 , 2123 , 1112 , ..." 
] 
+0

喜桑德羅。這個答案有點混亂,但我認爲可以改進。 (1)它需要適當的縮進。 (2)1590不是有效的ASCII碼(ASCII值是7或8位長),所以我認爲你可能在尋找UTF碼,而不是ASCII碼,但這個問題應該澄清一下。 (3)通過將轉換放在單獨的函數中,您可以將此問題重寫爲純Ruby,而不使用Rails。然後可以顯示如何使用該功能,顯示您正在給該功能的實際輸入。 –

+0

是的,我需要utf不ascii對不起 – Sandro

+0

1590是正確的這是一個波斯字符,但2123,1112是假的,我花了兩天在這種情況下,我絕對不知道我該怎麼處理這個案件 – Sandro

回答

2

您可以使用String#unpack()方法,decodes str (which may contain binary data) according to the format string, returning an array of each value extracted

# find will already return an object, not an array 
# note it will throw an exception if user with id doesn't exist 
# to get nil instead of exception, use find_by_id(params[:id]) 
@user = DoctorProfile.find(params[:id]) 

char_codes = @user.first_name.unpack('U*') 

或者,如果first_name可能nil,您可以用安全導航操作處理:

char_codes = @user.first_name&.unpack('U*') || [] 

U代表UTF-8,和*會佔用所有剩餘的元素。

它將返回碼的數組:

"Any Name".unpack('U*') 
# => [65, 110, 121, 32, 78, 97, 109, 101] 

如果你需要用逗號分隔碼的String(如你的例子),你可以簡單地join它:

char_codes.join(', ') 
相關問題