ruby `encode': "\xC3" 从 ASCII-8BIT 到 UTF-8 (Encoding::UndefinedConversionError)

Posted

技术标签:

【中文标题】ruby `encode\': "\\xC3" 从 ASCII-8BIT 到 UTF-8 (Encoding::UndefinedConversionError)【英文标题】:ruby `encode': "\xC3" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)ruby `encode': "\xC3" 从 ASCII-8BIT 到 UTF-8 (Encoding::UndefinedConversionError) 【发布时间】:2014-06-12 03:28:40 【问题描述】:

tvdb 的《汉尼拔》剧集中有奇怪的角色。

例如:

Œuf

于是 ruby​​ 吐出来了:

./manifesto.rb:19:in `encode': "\xC3" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
    from ./manifesto.rb:19:in `to_json'
    from ./manifesto.rb:19:in `<main>'

第 19 行是:

puts @tree.to_json

有没有办法处理这些非utf字符?我宁愿不替换它们,而是转换它们?还是忽略它们?我不知道,任何帮助表示赞赏。

奇怪的是脚本通过 cron 可以正常工作。手动运行它会产生错误。

【问题讨论】:

将正确的代码页设置为ISO-8859-1 而不是ASCII-8BIT 到变量@tree 作为@tree.force_encoding('ISO-8859-1')。因为ASCII-8BIT 仅用于二进制文件。 我猜cron 环境会以某种方式为您解析默认输入编码。我认为您的输入实际上首先是 UTF-8(C3 是在欧洲字符的多字节字符开头看到的常见字节) @Малъ Скрылевъ:在这种情况下,我认为输入可能不是 ISO-8859 变体,而是错误默认的 UTF-8。尽管只有一个没有匹配字符的样本点,它可能是任何东西 @NeilSlater 你为什么这么认为? iso cp中的字符Œ不是吗? 如果 sudo 解决了问题,问题出在默认 cp,请知道默认 cp 是哪个,并在 ruby​​ 中为默认用户设置它。像这样:Encoding.default_external = Encoding::UTF_8 将 utf 替换为正确的 【参考方案1】:

我在保存到数据库时遇到了同样的问题。我将提供一件我使用的东西(也许这会对某人有所帮助)。

如果您知道有时您的文本中有奇怪的字符,那么 在保存之前,您可以将文本编码为其他格式,然后 文本从数据库返回后再次解码。

示例:

string = "Œuf"

在保存之前我们对字符串进行编码

text_to_save = CGI.escape(string)

(“%C5%92”中编码的字符“Œ”,其他字符保持不变)

=> "%C5%92uf"

从数据库加载并解码

CGI.unescape("%C5%92uf")

=> "Œuf"

【讨论】:

【参考方案2】:

看来您应该为对象使用另一种编码。您应该为变量@tree 设置正确的代码页,例如,使用iso-8859-1 而不是ascii-8bit,使用@tree.force_encoding('ISO-8859-1')。因为ASCII-8BIT 仅用于二进制文件。

要查找 ruby​​ 的当前外部编码,请发出:

Encoding.default_external

如果sudo 解决了问题,则问题出在默认代码页(编码)中,因此要解决此问题,您必须通过以下任一方式设置正确的默认代码页(编码):

    在 ruby​​ 中将编码更改为utf-8 或其他适当的编码,请执行以下操作:

    Encoding.default_external = Encoding::UTF_8
    

    在bash、grep 当前有效设置中:

    $ sudo env|grep UTF-8
    LC_ALL=ru_RU.UTF-8
    LANG=ru_RU.UTF-8
    

    然后以类似的方式将它们正确设置为.bashrc,但不完全使用ru_RU语言,例如:

    export LC_ALL=ru_RU.UTF-8
    export LANG=ru_RU.UTF-8
    

【讨论】:

【参考方案3】:

File.open(yml_file, 'w') 应该改为 File.open(yml_file, 'wb')

【讨论】:

问题中发布的代码不包含File.open(...)这一行。那你什么意思? 好的,所以这个答案实际上帮助了我。如果您将 YAML 写入这样的文件:File.open('/path/to/file.yml', 'wb') |f| YAML.dump(data, f) ,如果您遗漏了 b,则会在标题中出现错误。 这个问题对打开的文件只字未提 实际上它帮助了我,因为我在使用file.puts datafile = File.open("response.txt", "w") 时遇到了这个错误Encoding::UndefinedConversionError: "\xC3" from ASCII-8BIT to UTF-8,但在添加b 参数后它工作正常。但如果在@unplugandplay 中包含解释,它会派上用场【参考方案4】:

我刚刚经历了几个小时试图解决类似问题。我检查了我的语言环境、数据库编码以及我能想到的所有内容,并且仍在从数据库中获取 ASCII-8BIT 编码的数据。

好吧,事实证明,如果您将文本存储在二进制字段中,它将自动作为 ASCII-8BIT 编码的文本返回,这是有道理的,但是这可能(显然)会导致您的应用程序出现问题。

可以通过在迁移中将列编码改回:text 来解决此问题。

【讨论】:

以上是关于ruby `encode': "\xC3" 从 ASCII-8BIT 到 UTF-8 (Encoding::UndefinedConversionError)的主要内容,如果未能解决你的问题,请参考以下文章

Flutter FormatException: Bad UTF-8 encoding 0xc3 (at offset 172)

Ruby:如何自动添加“# encoding: UTF-8”?

将 \xc3\xd8\xe8\xa7\xc3\xb4\xd 转换为人类可读格式

Python NLTK:SyntaxError:文件中的非 ASCII 字符“\xc3”(情绪分析-NLP)

text Ruby编码#memo #ruby #encoding

ruby字符串的encoding,force_encoding,encode,encode!转码(编码转换)