3

我有 ruby​​ 2.0.0p195(2013-05-14 修订版 40734)[x86_64-linux] 当我运行以下代码时:

char = "\u00D7"

(1..10).each {
    puts char.bytes.collect { |b| b.ord }.inspect
    puts char
    char.next!
}

我得到以下输出:

[195, 151]
×
[195, 152]
Ø
[195, 153]
Ù
[195, 154]
Ú
[195, 155]
Û
[195, 156]
Ü
[195, 157]
Ý
[195, 158]
Þ
[195, 159]
ß
[195, 160]
à

但是,当我将 char 初始化为时\u00D6,如下所示:

char = "\u00D6"

(1..10).each {
    puts char.bytes.collect { |b| b.ord }.inspect
    puts char
    char.next!
}

我得到以下信息:

[195, 150]
Ö
[195, 128, 195, 128]
ÀÀ
[195, 128, 195, 129]
ÀÁ
[195, 128, 195, 130]
ÀÂ
[195, 128, 195, 131]
ÀÃ
[195, 128, 195, 132]
ÀÄ
[195, 128, 195, 133]
ÀÅ
[195, 128, 195, 134]
ÀÆ
[195, 128, 195, 135]
ÀÇ
[195, 128, 195, 136]
ÀÈ

为什么每种情况下的行为如此不同?

4

1 回答 1

0

这是我对这个问题的基本理解。

Unicode 字符应根据 unicode 排序算法进行排序。整理表显然,Ruby 没有正确地做到这一点。我检查了以前的版本并遇到了同样的错误。排序规则也会影响next/succ方法。

为了获得适当的 unicode 排序规则,请尝试TwitterCLDR,其中包含排序排序规则的实现。

为了使您的原始代码按预期工作,请尝试这样的事情

char = "\u00D6"

10.times do
    puts char.bytes.collect { |b| b.ord }.inspect
    puts char
    char = char.b.next.force_encoding("UTF-8")
end

b字符串转换为 ASCII-8BIT,然后我们递增并转换回来。这很复杂,但它有效。

于 2013-07-16T17:37:42.353 回答