2013-10-14 97 views
0

我不知道如何告訴Iconv將我的字符串轉碼爲可讀輸出。如何正確地將UTF8轉換爲cp1252(1.8.7)

示例:我正在將「拉丁文大寫字母與CARON」U+0160轉換爲Š

Iconv.conv('cp1252', 'UTF8', 'Š'),但是返回"\212"

我希望它返回相當於CP1252字符,0x8A,也呈現爲Š。然而,打印結果仍然是"\212" - 它是八進制表示(\2120x8A138的八進制)。

我也嘗試了一些更具異國情調的編碼指令,如cp1252//IGNORE//TRANSLIT,輸出相同。

我在做什麼錯,該怎麼辦?

謝謝

編輯

卡斯帕爾說,控制檯輸出應正確顯示的字符,但它沒有。也許我只是不知道如何設置它來接受cp1252。

如果有人能告訴我怎麼做,我將不勝感激 - 我工作的Ubuntu 13.04,並都與IRB和的RubyMine的內置控制檯顯示器的輸出作爲"\212"

locale輸出正規的bash是所有值的en_US.UTF8

Iconv.conv('cp1252', 'UTF8', 'Š').inspect打印"\"\\212\""

Iconv.conv('cp1252', 'UTF8', 'Š').each_byte { |b| p b }打印138"\212"

+2

聽起來對我來說是正確的。 'puts「\ 212」'應該輸出你需要什麼時候你的終端配置爲cp1252? – Casper

+0

卡斯帕是正確的 - 你必須從Ruby獲取字符串到知道如何正確顯示它的設備。 Ruby不會爲你呈現字形,如果有疑問,「irb」或「inspect」會輸出轉義的八進制,所以你至少可以清楚地看到字符串中的內容。 –

+0

@Casper這就是我所期望的,但是我的字面意思是「\ 212」,這就是我問的原因。請參閱編輯。 – kostja

回答

2

你檢查值。從IRB:

$ irb 
>> "\x8A" 
=> "\212" 

這是一樣的:

>> puts "\x8A".inspect 
"\212" 
=> nil 

相反,你必須打印值:

>> puts "\x8A" 
� 
=> nil 

我的終端顯示 「」 因爲0x8A是無效的序列在UTF-8(我的終端的編碼)。如果我將終端更改爲CP-1252,則顯示「Š」。