2013-01-15 27 views
2

如何獲取Ruby串的兼容編碼列表? (MRI 1.9.3)Ruby串,獲取兼容編碼列表

用例:我有一些用戶提供的字符串,用UTF-8編碼。理想情況下,我需要將它們轉換爲ISO/IEC 8859-1(8位),但是當出現一些特殊字符時,我還需要退回到unicode。

另外,有沒有更好的方法來實現這一目標?也許我正在測試錯誤的東西。


編輯 - 添加更多細節
坦克的答案,我也許應該補充一些背景。 我知道如何執行編碼轉換。
我正在尋找一種方法來快速找出一個字符串是否可以安全地編碼爲另一種編碼,或者,以另一種方式(以及相當錯誤的方式),什麼是最小編碼以支持所有字符那個字符串。

只是轉換字符串16字節是不是一種選擇,因爲他們將作爲短信發送,並把它們轉換成一個16字節編碼削減160可用字符的數量下降到70

我僅當它們包含ISO/IEC 8859-1中不支持的特殊字符時才需要將它們轉換爲16字節。

+0

這可能有助於一點點:http://yehudakatz.com/2010/05/05/ruby-1-9-encodings-a-primer-and-the-solution-for- rails/ – Casper

+0

這不是一個用例...首先使用unicode編碼實際上是相同的,但更簡單 – Esailija

+0

@Esailija謝謝,如果我能做到的話。首先,我不能使用unicode,因爲我需要最小化字符串的大小。我正在與[SMPP](http://en.wikipedia.org/wiki/SMPP)一起工作,需要從字符串中構建一個字節緩衝區。我應該使用16位編碼作爲最後的手段。 – tompave

回答

3

不幸的是,Ruby的編碼兼容性思想並不完全符合您的使用案例。然而,試圖在編碼ISO-8859-1您的UTF-8字符串接球時引發轉化時不可能將實現你所追求的錯誤:

begin 
    'your UTF-8 string'.encode!('ISO-8859-1') 
rescue Encoding::UndefinedConversionError 
end 

將轉換您的字符串異8859-1如果可能,並保留爲UTF-8,否則。

注意這個使用encode,這實際上轉碼使用Encoding::Converter(即重新分配正確的編碼字節模式字符串的字符表示),不像force_encoding,這只是改變的編碼標誌(即告訴紅寶石串根據設置的編碼解釋字符串的字節流)。

-1

要轉換爲ISO-8859-1,您可以按照以下代碼對其進行編碼。

1.9.3p194 :002 > puts "é".force_encoding("ISO-8859-1").encode("UTF-8") 
é 
=> nil 

Linked Answer

2

Ruby有standard library其中u能找到Encoding類和他所謂的Encoding::Converter,他們可能是你最好的朋友在這種情況下,子類。

#!/usr/bin/env ruby 
# encoding: utf-8 

converter = Encoding::Converter.new("UTF-8", "ISO-8859-1") 
converted = converter.convert("é") 

puts converted.encoding 
# => ISO-8859-1 

puts converted.dump 
# => "\xE9" 
2

valid_encoding?instance method of String)有用嗎?那就是:

try_str = str.force_encoding("ISO/IEC 8859-1") 
str = try_str if try_str.valid_encoding? 
+0

這將測試二進制兼容性,這隻能在ASCII下層窗格中的字符兼容性(又名ASCII -7- BIT)。 OP要求表示兼容性,即測試哪些非單字節UTF-8編碼字符可映射到ISO-8859-1單字節編碼的方法。請參閱[我的答案](http://stackoverflow.com/a/14348119/990363)以獲得實際解決方案。 – kopischke