gpt4 book ai didi

ruby - 导入 YAML 文件时如何使用内部/外部编码?

转载 作者:数据小太阳 更新时间:2023-10-29 07:14:12 25 4
gpt4 key购买 nike

无论编码如何,如何加载 YAML 文件?

我的 YAML 文件可以用 UTF-8 或 ANSI 编码(这就是 Notepad++ 所称的 - 我猜它是 Windows-1252):

:key1:
:key2: "ä"
utf8.yml编码为 UTF-8 , ansi.yml编码为 ANSI .我按如下方式加载文件:
# encoding: utf-8

Encoding.default_internal = "utf-8"

utf8_load = YAML::load(File.open('utf8.yml'))
utf8_load_file = YAML::load_file('utf8.yml')
ansi_load = YAML::load(File.open('ansi.yml'))
ansi_load_file = YAML::load_file('ansi.yml')

Ruby 似乎无法正确识别编码:
utf8_load      [:key1][:key2].encoding  #=> "UTF-8"
utf8_load_file [:key1][:key2].encoding #=> "UTF-8"
ansi_load [:key1][:key2].encoding #=> "UTF-8"
ansi_load_file [:key1][:key2].encoding #=> "UTF-8"

因为字节不一样:
utf8_load      [:key1][:key2].bytes  #=> [195, 164]
utf8_load_file [:key1][:key2].bytes #=> [195, 164]
ansi_load [:key1][:key2].bytes #=> [239, 191, 189]
ansi_load_file [:key1][:key2].bytes #=> [239, 191, 189]

如果我想念 Encoding.default_internal = "utf-8" ,字节也不同:
utf8_load      [:key1][:key2].bytes  #=> [195, 131, 194, 164]
utf8_load_file [:key1][:key2].bytes #=> [195, 164]
ansi_load [:key1][:key2].bytes #=> [195, 164]
ansi_load_file [:key1][:key2].bytes #=> [239, 191, 189]
  • 当我不设置 default_internal 时实际会发生什么至 utf-8 ?
  • 两个示例中的字符串都有哪些编码?
  • 即使我不知道其编码,如何加载文件?
  • 最佳答案

    我相信官方 YAML 只支持 UTF-8(也许还有 UTF-16)。历史上,YAML 库中存在各种编码混淆。我认为您在尝试使用 Unicode 编码以外的 YAML 时会遇到麻烦。

    1. What happens actually when I don't set the default_internal to utf-8?

    Encoding.default_internal 控制您的输入在读入时将被转换为的编码,至少通过一些尊重 Encoding.default_internal 的操作,并非一切都如此。 Rails 似乎将其设置为 UTF-8。因此,如果您不将 Encoding.default_internal 设置为 UTF-8,则无论如何它可能已经是 UTF-8。

    如果 Encoding.default_internalnil ,那么那些尊重它的操作,并在读入时尝试将任何输入转换为 Encoding.default_internal 不会这样做,他们将在它被认为源自的编码中留下任何输入,而不是尝试转换它。

    如果您将其设置为其他内容,例如“WINDOWS-1252”,Ruby 会在使用 File.open 读取您的内容时自动将其转换为 WINDOWS-1252,当您传递现在已编码并标记为 WINDOWS 的字符串时,这可能会混淆 YAML::load -1252 到它。通常没有充分的理由这样做,所以不要理会 Encoding.default_internal

    注意: Ruby docs 说:

    "You should not set ::default_internal in Ruby code as strings created before changing the value may have a different encoding from strings created after the change. Instead you should use ruby -E to invoke Ruby with the correct default_internal."



    另见: http://ruby-doc.org/core-1.9.3/Encoding.html#method-c-default_internal

    1. Which encodings do the strings in both examples have?


    我真的不知道。人们将不得不查看字节并试图弄清楚它们是否是各种似是而非的编码的合法字节,以及是否合法,如果它们意味着可能是有意的。

    例如: "ÉGÉìÉRÅ[ÉfÉBÉìÉOÇÕìÔǵÇ≠ǻǢ" 。这是一个完美的 合法 UTF-8 字符串,但作为人类我们知道它可能不是故意的,并且可能是垃圾,很可能是编码误解的结果。但是计算机无法知道这一点,它是完全合法的 UTF-8,而且,嘿,也许有人真的故意写 "ÉGÉìÉRÅ[ÉfÉBÉìÉOÇÕìÔǵÇ≠ǻǢ" ,毕竟,我只是在写这篇文章时做到了!

    因此,您可以尝试根据各种编码来解释字节,并查看它们中的任何一个是否有意义。

    在这一点上,你真的只是在猜测。意思是...

    1. How can I load a file even if I don't know it's encoding?


    一般来说,你不能。您需要了解并跟踪编码。如果不知道字节的编码,就没有真正的方法来知道字节的含义。

    如果您有一些丢失的遗留数据,则必须尝试弄清楚。手动,或使用一些尝试基于启发式猜测可能的编码的代码。这是一个 Ruby gem Charlock Holmes,它尝试使用 ICU 库启发式算法进行猜测(此特定 gem 仅适用于 MRI)。

    Ruby 在响应 string.encoding 时所说的只是字符串标记的编码。字符串可以用错误的编码标记,字符串中的字节实际上并不意味着它所标记的编码的意图......在这种情况下你会得到垃圾。

    只有当字符串的编码标记正确时,Ruby 才会对您的字符串做正确的事情,而不是创建垃圾。默认情况下,对于大多数输入操作,字符串的编码标记由 Encoding.default_external 确定( Encoding.default_external 通常以 UTF-8ASCII-8BIT 开头,这实际上意味着空编码、二进制数据、未标记编码),或者通过将参数传递给 File.open : File.open("something", "r:UTF-8" 或者,意味着同样的事情, File.open("something", "r", :encoding => "UTF-8") 。实际字节由文件中的内容决定。由您来告诉 Ruby 正确的编码以将这些字节解释为文本,这意味着它们的意图。

    最近在 reddit/r/ruby 上有几篇帖子试图解释如何解决和解决编码问题,您可能会发现这些问题有帮助:
  • http://www.justinweiss.com/articles/how-to-get-from-theyre-to-theyre/
  • http://www.justinweiss.com/articles/3-steps-to-fix-encoding-problems-in-ruby/

  • 另外,这是我最喜欢的关于一般理解编码的文章: http://kunststube.net/encoding/

    特别是对于 YAML 文件,如果我是你,我会确保它们都是 UTF-8。生活会轻松得多,您不必担心。如果您有一些已损坏的遗留文件,修复它们会很痛苦,但这就是您必须做的,除非您可以从头开始重写它们。尝试将它们修复为有效且正确的 UTF-8,并从这里开始将所有 YAML 保留在 UTF-8 中。

    关于ruby - 导入 YAML 文件时如何使用内部/外部编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32748843/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com