【问题标题】:Ruby, pack encoding (ASCII-8BIT that cannot be converted to UTF-8)Ruby,包编码(ASCII-8BIT 不能转换为 UTF-8)
【发布时间】:2012-03-09 01:27:32
【问题描述】:
puts "C3A9".lines.to_a.pack('H*').encoding

结果

ASCII-8BIT

但我更喜欢 UTF-8 格式的文本。但是

"C3A9".lines.to_a.pack('H*').encode("UTF-8")

结果

`encode': "\xC3" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)

为什么?如何将其转换为 UTF-8?

【问题讨论】:

    标签: ruby encoding utf-8


    【解决方案1】:

    你以错误的方式解决这个问题。如果你有这样的 URI 编码数据:

    %C5%BBaba
    

    那么你应该使用URI.unescape来解码它:

    1.9.2-head :004 > URI.unescape('%C5%BBaba')
     => "Żaba"
    

    如果这不起作用,则强制编码为 UTF-8:

    1.9.2-head :004 > URI.unescape('%C5%BBaba').force_encoding('utf-8')
     => "Żaba"
    

    【讨论】:

    • 这个神奇的URIclass 是从哪里来的? open-uri? rails? CGI.rb?
    • @Linux_iOS.rb.cpp.c.lisp.m.sh:require 'uri'
    • 谢谢。这在未来可能会非常有用。
    • 再一次,相关的编码问题(“URI.unescape 在尝试将“%C3%9Fą”转换为“ßą”时崩溃):stackoverflow.com/questions/10328086/…也许有人知道发生了什么?
    【解决方案2】:

    ASCII-8bit 是 Ruby 原生的伪装编码。它有一个BINARY 的别名,就是这样。 ASCII-8bit 不是字符编码,而是一种表示字符串是二进制数据而不像文本一样处理的方式。因为pack/unpack 函数被设计为对二进制数据进行操作,所以除非整个包字符串由字符派生组成,否则您永远不应假设返回在任何编码下都是可打印的。如果您阐明总体目标是什么,也许我们可以为您提供更好的解决方案。


    如果您将十六进制 UTF-8 代码隔离到一个变量中,例如 code,它是一个十六进制格式减去百分号的字符串:

    utf_char=[code.to_i(16)].pack("U")
    

    将这些与字符串的其余部分结合起来,您可以制作您的字符串。

    【讨论】:

    • 我收到 UTF-8 格式的十六进制文本:“%C5%BB”而不是“Ż”(上面带点的拉丁文大写字母 Z)。我发现 在写入文件时会产生“Ż”,但不幸的是我无法在应用程序中使用此转换的结果,因为到 ASCII-8bit 问题(我基于 dailyhacking.posterous.com/… 这个东西)
    • 那么确切的十六进制字符串是什么样的?
    • "%C5%BBaba" 是 "Żaba",只有“奇怪”的字母是用十六进制写的
    • 所以你的百分号表示一个两个字符的十六进制数字?
    • 是的,% 只在十六进制代码之前使用,所以我需要将保存为十六进制的 utf-8 转换为 utf-8 的方法
    猜你喜欢
    • 2011-10-26
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2013-04-19
    • 2011-08-23
    相关资源
    最近更新 更多