【问题标题】:How to convert UTF8 to cp1252 correctly (1.8.7)如何正确将 UTF8 转换为 cp1252 (1.8.7)
【发布时间】:2013-10-22 03:48:18
【问题描述】:

我不知道如何告诉Iconv 将我的字符串转码为可读输出。

示例:我正在转换“带有 CARON 的拉丁大写字母 S”U+0160,呈现为 Š

Iconv.conv('cp1252', 'UTF8', 'Š') 然而返回"\212"

我希望它返回等效的 cp1252 字符 0x8A,也呈现为 Š。然而,打印的结果仍然是"\212" - 它是八进制表示(\212 是八进制的0x8A138)。

我还尝试了一些更奇特的编码指令,例如 cp1252//IGNORE//TRANSLIT,输出相同。

我做错了什么,应该怎么做?

谢谢

编辑

Casper 说,控制台输出应该正确呈现字符,但事实并非如此。也许我只是不知道如何将其设置为接受 cp1252。

如果有人能告诉我怎么做,我将不胜感激 - 我正在使用 Ubuntu 13.04,使用 irb 的常规 bash 和 RubyMine 的内置控制台都将输出显示为 "\212"

locale 的输出对于所有值都是 en_US.UTF8

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

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

【问题讨论】:

  • 听起来对我来说是正确的。 puts "\212" 应该在你的终端配置为 cp1252 时输出你需要的东西?
  • Casper 是对的——您必须将字符串从 Ruby 获取到知道如何正确显示它的设备。 Ruby 不会为您呈现字形,如果有疑问 irbinspect 将输出转义的八进制数,因此至少您可以清楚地看到字符串中的内容。
  • @Casper 这就是我的预期,但是我得到的字面意思是“\212”,这就是我问的原因。请查看编辑。

标签: ruby encoding utf-8 iconv cp1252


【解决方案1】:

您正在检查价值。来自 IRB:

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

这与:

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

相反,您必须打印该值:

>> puts "\x8A"
�
=> nil

我的终端显示“�”,因为 0x8A 是 UTF-8 中的无效序列(我的终端的编码)。如果我将终端更改为 CP-1252,它会显示“Š”。

【讨论】:

    猜你喜欢
    • 2015-05-27
    • 2012-03-21
    • 1970-01-01
    • 2017-02-24
    • 2012-03-12
    • 2012-02-10
    • 2011-05-07
    • 1970-01-01
    • 2015-09-24
    相关资源
    最近更新 更多