2017-08-01 94 views
0

如何保持所有字符從UTF-8轉換爲CP1252的紅寶石2.2轉換UTF-8 CP1252紅寶石2.2

驗證碼:

file = 'd:/1 descrição.txt' 
puts file.encode('cp1252') 

給這個錯誤:

`encode': U+0327 to WINDOWS-1252 in conversion from UTF-8 to WINDOWS-1252 (Encoding::UndefinedConversionError) 

我的應用程序需要cp1252,但我找不到任何方法來保留所有的字符。

我不能替換這個字符,因爲以後我會用這個信息從文件系統讀取文件。

puts file.encode('cp1252', undef: :replace, replace: '') 
> d:/1 descricao.txt 

PS:這是一個Ruby腳本不on Rails應用程序紅寶石

+1

我正在使用Ruby 2.3,並且您的代碼不會產生錯誤。你確定這個字符串是正確的,並且在你的源代碼中實際上是UTF-8嗎? – tadman

回答

3

UTF-8的Unicode覆蓋的整個範圍,但CP1252僅包括其中的一個子集。顯然這意味着有可以用UTF-8編碼的字符,但不能用CP1252編碼。這是你面臨的問題。

在你的例子中它看起來像像字符串只包含應該在CP1252中工作的字符,但顯然它不。

錯誤消息中的字符U+0327combining character,不能在CP1252中表示。它結合前面的c生產çç也可以表示爲單個字符(U+00E7),其中可表示在CP1252中。

一個選項可能是normalisation,它會將字符串轉換爲可在CP1252中表示的格式。

file = 'd:/1 descrição.txt'.unicode_normalize(:nfc) 
puts file.encode('cp1252') 

(看來,Stack Overflow是顯示你的問題,這可能是爲什麼複製從問題的代碼並運行它不會產生任何錯誤時正常化的字符串。)

這將避免錯誤,但請注意,除非原始格式已經處於已知規範化格式,否則不一定可以將該過程反轉爲獲取原始字符串。

+0

你是對的! 謝謝! – ricardo