ruby`encode';:&引用\xC3“;从ASCII-8BIT到UTF-8(编码::未定义的转换器错误)
tvdb中的汉尼拔插曲中有一些奇怪的角色 例如:ruby`encode';:&引用\xC3“;从ASCII-8BIT到UTF-8(编码::未定义的转换器错误),ruby,encoding,utf-8,iso-8859-1,ascii-8bit,sudo,bash,Ruby,Encoding,Utf 8,Iso 8859 1,Ascii 8bit,Sudo,Bash,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>' 有没有办法处理这些非utf字符?我宁愿不替换它们,
Œ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>'
有没有办法处理这些非utf字符?我宁愿不替换它们,而是转换它们?还是忽略它们?我不知道,谢谢你的帮助
奇怪的是,脚本通过cron工作得很好。手动运行会产生错误。似乎应该对对象使用另一种编码。您应该为变量
@tree
设置正确的代码页,例如,使用而不是使用@tree.force_编码('ISO-8859-1')
。因为ASCII-8BIT
仅用于二进制文件
要查找ruby的当前外部编码,请发出:
Encoding.default_external
如果解决了此问题,则问题出现在默认代码页(编码)中,因此要解决此问题,您必须通过以下任一方式设置正确的默认代码页(编码):
Encoding.default_external = Encoding::UTF_8
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
我刚刚花了几个小时试图解决一个类似的问题。我检查了我的区域设置、数据库编码以及我能想到的一切,仍然从数据库中获取ASCII-8BIT编码的数据 事实证明,如果将文本存储在二进制字段中,它将自动作为ASCII-8BIT编码的文本返回,这是有道理的,但是这(显然)会在应用程序中导致问题
在迁移过程中,可以将列编码改回
:text
。文件。open(yml_文件,'w')应改为File。open(yml_文件,'wb)保存到数据库时,我遇到了同样的问题。我会提供一个我使用的东西(也许,这会帮助某人)
如果您知道有时您的文本有奇怪的字符,那么
在保存之前,您可以将文本编码为其他格式,然后
从数据库返回文本后,再次对其进行解码
例如:
string = "Œuf"
在保存之前,我们对字符串进行编码
text_to_save = CGI.escape(string)
(字符“Œ”编码在“%C5%92”中,其他字符保持不变)
=>%C5%92uf
从数据库加载并解码
CGI.unescape("%C5%92uf")
=>“Œuf”将变量
@tree
设置为@tree
的适当代码页,如ISO-8859-1
而不是ASCII-8BIT
。强制_编码('ISO-8859-1')。因为ASCII-8BIT
仅用于二进制文件。我猜cron
环境正在以某种方式为您解决默认的输入编码。首先,我认为您的输入实际上是UTF-8(C3是一个常见的字节,在欧洲字符的多字节字符开头可以看到)@МаъСъСъъъъ:在这种情况下,我认为输入可能不是ISO-8859变体,而是错误默认的UTF-8。虽然只有一个样本点没有匹配字符,但它可能是anything@NeilSlater你为什么这么想?iso cp中的字符不是吗?如果sudo解决了问题,那么问题是在默认cp中,请了解默认cp是什么,并在ruby中为默认用户设置它。如下所示:Encoding.default\u external=Encoding::UTF\u 8
将UTF替换为正确的UTF问题中发布的代码不包含一行文件。打开(…)
。那你是什么意思?好吧,这个答案真的帮助了我。如果您将YAML写入这样的文件:file.open('/path/to/file.yml',wb'){f | YAML.dump(data,f)}
,如果您省略b
,则标题中会出现错误。这个问题并没有说明打开的文件实际上对我有帮助,因为我遇到了这个错误Encoding::unfinedconversioner:“\xC3”当执行file.put时,从ASCII-8BIT到UTF-8
使用file=file.open(“response.txt”,“w”)
打开数据,但添加b
参数后,效果良好。但是如果在这里包含解释@plugandplay,它会派上用场
CGI.unescape("%C5%92uf")