アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

半角スペースに2種類あって困った話

いや、2種類あること自体は知ってたんですけど。
文字コード32と160ですね。※10進数

普通にスペースキー打って出てくるのは32の方です。
これ→「 」
160の方は、キーボードで打つことができるのかどうかは分かりませんが、
これ→「 」

(尚、ここでは↓のようにして出してます)

これ→「 」
これ→「 」

まあもちろん見ても分からないんですけど、
これをテキストエディタにコピペすれば違いが分か…
…。
…違わねえ!!両方32だ!!!
(環境:Firefoxで表示→秀丸にコピペ、32の半角スペースで検索すると両方ヒット)

ぐぬぬ
とにかくこれがデータベースに入ってて、もう一方の半角スペースで検索クエリ投げてもヒットしない。
そりゃそうだ、別の文字なんだもん。
でも見た目は半角スペースだからヒットさせたい。

ので、MySQLの該当カラムの照合順序をutf8_general_ciからutf8_unicode_ciに変更して対応しました。
INSERT時・SELECT時にアプリ側で32に統一してやるとよいのかもしれないけど、工数とかごにょごにょ


まあそういう感じでサクッと対応しましたが、
そもそもブラウザからコピペしても勝手に32になるようなやつがなんで160のままデータベースに紛れこむんだよ…と思っていろいろ調べてみたところ

  • そもそもHTMLタグでよく使う「nbsp」は160の方だった(知らなかった!)
  • ブラウザに表示された160をテキストエディタにペーストするといつの間にか32になっているのだが、「一旦Excelにペースト→それをもう一度コピーしてテキストエディタにペースト」とすると何故か160のまま

ということだったので、例えば「160を含む文字列をコピーしてExcelに貼り付け、それを元にデータINSERT」とかやられると160のままなわけだ。なんてこったい
(…いや、冷静に考えると、見た目同じとはいえ勝手に別の文字にすり変わる方がおかしい気もしますが)