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

ric*_*rdo 0 ruby utf-8

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

\n\n

这段代码:

\n\n
file = 'd:/1 descri\xc3\xa7\xc3\xa3o.txt'\nputs file.encode('cp1252')\n
Run Code Online (Sandbox Code Playgroud)\n\n

给出这个错误:

\n\n
`encode': U+0327 to WINDOWS-1252 in conversion from UTF-8 to WINDOWS-1252 (Encoding::UndefinedConversionError)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

我无法替换这些字符,因为稍后我将使用此信息从文件系统读取文件。

\n\n
puts file.encode('cp1252', undef: :replace, replace: '')\n> d:/1 descricao.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n

ps:这是一个 ruby​​ 脚本,而不是 ruby​​ on Rails 应用程序

\n

mat*_*att 5

UTF-8 涵盖了 unicode 的整个范围,但 CP1252 仅包括其中的一个子集。显然,这意味着有些字符可以用 UTF-8 编码,但不能用 CP1252 编码。这就是您面临的问题。

\n\n

在你的例子中它看起来只包含应该在 CP1252 中工作的字符,但显然它不包含\xe2\x80\x99t。

\n\n

错误消息中的字符U+0327组合字符,在 CP1252 中无法表示。它与前面的结合c产生\xc3\xa7. \xc3\xa7也可以表示为单个字符 ( U+00E7 ),

\n\n

一种选择可能是标准化,它将字符串转换为可以在 CP1252 中表示的形式。

\n\n
file = \'d:/1 descri\xc3\xa7\xc3\xa3o.txt\'.unicode_normalize(:nfc)\nputs file.encode(\'cp1252\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

(看起来 Stack Overflow 在显示您的问题时正在规范化字符串,这可能就是为什么从问题中复制代码并运行它不会\xe2\x80\x99 产生任何错误。)

\n\n

这将避免错误,但请注意,不一定可以反转该过程来获取原始字符串,除非原始字符串已经采用已知的标准化形式。

\n