何らかの理由で、Unicode 文字の範囲比較で予期しない結果が得られます。
要約すると、最小化されたテスト コードで("\u1000".."\u1200") === "\u1100"
はfalse
、は であると予想されますが、true
に対する同じテスト"\u1001"
はtrue
予想どおりです。これはまったく理解できないと思います。演算子の結果<
も興味深いもので、矛盾してい===
ます。
次のコードは、適切な最小限の例です。
# encoding: utf-8
require 'pp'
a = "\u1000"
b = "\u1200"
r = (a..b)
x = "\u1001"
y = "\u1100"
pp a, b, r, x, y
puts "a < x = #{a < x}"
puts "b > x = #{b > x}"
puts "a < y = #{a < y}"
puts "b > y = #{b > y}"
puts "r === x = #{r === x}"
puts "r === y = #{r === y}"
===
ここでは、両方の操作が「true」を生成することを単純に期待します。ただし、このプログラムを実行した実際の出力は次のとおりです。
ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.3.0]
"\u1000"
"\u1200"
"\u1000".."\u1200"
"\u1001"
"\u1100"
a < x = true
b > x = true
a < y = true
b > y = true
r === x = true
r === y = false
誰かが私を啓発できますか?
(私は Mac OS X で 1.9.3 を使用しており、エンコーディングを明示的に utf-8 に設定していることに注意してください。)