簡體   English   中英

Ruby:將笑臉轉換為utf-8編碼

[英]Ruby: Smiley to utf-8 encoding

我該如何轉換

string = "ok test body 😁😁😁\r\n-- \r\n test"

入這個

"ok test body \\ud83d\\ude01\\ud83d\\ude01\\ud83d\\ude01\r\n-- \r\n test"

我已經試過了

string.encode('utf-16be','utf-8')

轉換成這種形式

#"ok test body \u{1F601} \u{1F601}\u{1F601}\r\n-- \r\n test"

我認為我需要正則表達式來解決這個問題。 誰能告訴我該怎么做。 謝謝

使用前面的答案 ,此代碼僅將'U+1F601' to "\?\?"轉換為非ascii字符:

encoded_string = string.gsub(/[^[:ascii:]]/) do |non_ascii|
  non_ascii.force_encoding('utf-8')
           .encode('utf-16be')
           .unpack('H*').first
           .gsub(/(....)/,'\u\1')
end

對於:

string = "ok test body 😁😁😁\r\n-- \r\n test"

它輸出:

"ok test body \\ud83d\\ude01\\ud83d\\ude01\\ud83d\\ude01\r\n-- \r\n test"

非常類似於Eric Duminil的答案

string.gsub(/[\u{10000}-\u{10FFFF}]/) { |m|
  '\u%s\u%s' % m.encode('UTF-16BE').unpack('H4H4')
}
#=> "ok test body \\ud83d\\ude01\\ud83d\\ude01\\ud83d\\ude01\r\n-- \r\n test"

正則表達式匹配代碼點U + 10000至U + 10FFFF,即來自補充平面的字符。 在UTF-16中,這些被表示為所謂的代理對

每個匹配的字符通過unpack拆分成其高低替代:(模式H4提取4個十六進制字符,即2個字節或16位)

'😁'.encode('UTF-16BE').unpack('H4H4')
#=> ["d83d", "de01"]

結果通過%格式化:

'\u%s\u%s' % ["d83d", "de01"]
#=> "\\ud83d\\ude01"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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