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

32 ruby encoding utf-8

tvdb中的汉尼拔剧集中有奇怪的人物.

例如:

Œuf
Run Code Online (Sandbox Code Playgroud)

所以红宝石吐出来:

./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>'
Run Code Online (Sandbox Code Playgroud)

第19行是:

puts @tree.to_json
Run Code Online (Sandbox Code Playgroud)

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

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

小智 20

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

  • 问题中发布的代码不包含“File.open(...)”行。所以你是什么意思? (2认同)
  • 好的,所以这个答案实际上帮助了我.如果你把YAML写成这样的文件:`File.open('/ path/to/file.yml','wb'){| f | YAML.dump(data,f)}`,如果省略`b`,你将在标题中得到错误. (2认同)

Мал*_*евъ 17

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

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

Encoding.default_external
Run Code Online (Sandbox Code Playgroud)

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

  1. 在ruby 中将编码更改为或其他正确的编码,请执行以下操作:

    Encoding.default_external = Encoding::UTF_8
    
    Run Code Online (Sandbox Code Playgroud)
  2. ,grep当前有效的设置:

    $ sudo env|grep UTF-8
    LC_ALL=ru_RU.UTF-8
    LANG=ru_RU.UTF-8
    
    Run Code Online (Sandbox Code Playgroud)

    然后.bashrc以类似的方式正确设置它们,但不完全用ru_RU语言,如下所示:

    export LC_ALL=ru_RU.UTF-8
    export LANG=ru_RU.UTF-8
    
    Run Code Online (Sandbox Code Playgroud)