2017-08-01 93 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