【发布时间】:2023-03-23 18:03:01
【问题描述】:
在 Ruby (v2.5.3) 处理编码字符串与 YAML 解析器的方式上,我遇到了一些奇怪的行为和不一致。这是一个例子:
"\x80" # Returns "\x80"
"\x80".bytesize # Returns 1
"\x80".bytes # Returns [128]
"\x80".encoding # Returns UTF-8
YAML.load('{value: "\x80"}')["value"] # Returns "\u0080"
YAML.load('{value: "\x80"}')["value"].bytesize # Returns 2
YAML.load('{value: "\x80"}')["value"].bytes # Returns [194, 128]
YAML.load('{value: "\x80"}')["value"].encoding # Returns UTF-8
我对 UTF-8 的理解是任何高于0x7F 的单字节值都应该被编码成两个字节。所以我的问题如下:
- 单字节字符串
"\x80"是有效的UTF-8 吗? - 如果是这样,为什么 YAML 会转换为两字节模式?
- 如果不是,为什么 Ruby 声称编码是 UTF-8 但包含无效的字节序列?
- 有没有办法使 YAML 解析器和 Ruby 字符串的行为方式彼此相同?
【问题讨论】:
-
"\x80".valid_encoding?绝对无效。不确定 YAML 在做什么 -
好点——我认为当你尝试设置它时它会抛出错误或其他东西,但我猜它只是允许字符串并说如果你检查它是无效的。
标签: ruby