mosowave

sinamon129による(主に)技術ブログ。Ruby,Ruby on Rails,Elasticsearchやその他について書きます。

見た目が一緒なUTF-8な文字列がなぜか一致しなかったお話

躓いたのでめも。

とあるcsvファイルのあるカラムと、DBにあるテーブルのあるカラム(文字列)が一致していたら、
テーブルのidをとってきてほげほげっていうコードをrubyでかいてた。

hoge.csvの中身
hoge_id,title,hoge,hoge2,hoge3
10,あばばば,あば,あばばば,あばばばば

DBのテーブル
id,title,piyo,piyopiyo,piyoyoyo
1,あばばば,aba,ababbababa,ほげほげ

みたいな(雑だけど

で、titleの部分を一致させたいんだけど、
どう見ても一致するとこが一致しない。
謎におもって、コマンドプロンプトにその文字列はっつけたら
片方は「あばばば」って表示されたんだけど、
もう片方は(csvのほう)は「あは<3099>は<3099>は<3099>」(´・ω・`)

この<3099>ってのは、
unicodeの正規化の方式でNFD方式らしい。
http://q.hatena.ne.jp/1246722275
utf-8だったらなんでもいいってわけじゃないのね(´・ω・`)

で、治す。
教えてもらったpythonばーじょん。

import codecs
import unicodedata
import sys

f = codecs.open(sys.argv[1], "r", "utf-8")
unistr = f.read()
print unicodedata.normalize('NFKC', unistr).encode("utf-8")

f.close

rubyhttp://sho.tdiary.net/20110204.htmlを参考にするといいみたい。
いまrubyでかいてるからruby版もやってみよう。


おしえてもらったこれすげーー
http://homepage1.nifty.com/nomenclator/unicode/normalization.htm