logo       

[ruby-list:42443] 日本語でのString#casecmpの利用について: msg#00097

lang.ruby.japanese

Subject: [ruby-list:42443] 日本語でのString#casecmpの利用について

片桐@ユービットと申します。


Shift_JISでエンコードされたひらがなや漢字を含む文字列に対して、
String#casecmpを使用するとどのような動作が期待できるのでしょうか?

ruby 1.8.1 (2003-12-25) [i686-linux]をRedHat Linux 9上で、

$KCODE = "S"
"\202\320".casecmp("\202\323")

を実行すると"0"が帰ってきます。"\202\320"と"\202\323"は、それぞれ、Shift_JIS
で、"ひ"と"ふ"になります。

"ひ"や"ふ"でそれぞれ、downcaseやupcaseメソッドを実行すると元の文字列と同じ文
字列が帰ってきます。

他のバージョンのrubyにおいても文字は違いますが、同様の現象を確認することがで
きました。(このメールの最後に自分が使用したコードがあります。)

ひらがなや漢字などが含む文字列に対しては、String#casecmpを使用してはいけない
のでしょうか?


以上、宜しくお願いします。


-----
片桐英人 <eito-HWss5khfY+4@xxxxxxxxxxxxxxxx>


-----以下、テストコード-----
$KCODE = "S"

require "test/unit"

class TC_String < Test::Unit::TestCase
def test_casecmd
# Creates an array of all hiraganas
hiragana = ["\202\240"] # Shift_JIS encoded hiragana 'a'
81.times do
hiragana << hiragana.last.succ
end

errors = []
hiragana.each do |src|
hiragana.each do |dst|
if src == dst
if src.casecmp(dst) != 0
error = "\"#{src}\".casecmp(\"#{dst}\") should return 0."
error << " (upcase: \"#{src.upcase}\", \"#{dst.upcase}\")"
error << " (downcase: \"#{src.downcase}\", \"#{dst.downcase}\")"
errors << error
end
else
if src.casecmp(dst) == 0
error = "\"#{src}\".casecmp(\"#{dst}\") should not return 0."
error << " (upcase: \"#{src.upcase}\", \"#{dst.upcase}\")"
error << " (downcase: \"#{src.downcase}\", \"#{dst.downcase}\")"
errors << error
end
end
end
end
assert(errors.empty?, errors.join("\n"))
end
end







<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise