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 data
和file = 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)