将UTF-8转换为CP1252 ruby​​ 2.2

时间:2017-08-01 17:16:47

标签: ruby utf-8

如何在ruby 2.2上保留所有字符从UTF-8转换为CP1252

此代码:

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脚本而不是rails应用程序上的ruby

1 个答案:

答案 0 :(得分:4)

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似乎正在规范字符串,这可能是为什么从问题中复制代码并运行它不会产生任何错误。)

这样可以避免错误,但请注意,除非原始字符串已经处于已知的规范化形式,否则不一定可以反转该过程以获取原始字符串。