デザインワン・ジャパン Tech Blog

DesignOne Japan | Activate the World.

文字コードの罠

はじめに

こんにちは!株式会社デザインワン・ジャパンでエキテンの開発を担当しているサービス開発部の寺井です。

文字コードを使う際、今の時代 UTF-8 を使うことがほとんどでしょう。 昔は Shift-JIS や EUC-JP などの文字コードが混在していて、文字化けをしばしば見かけましたが、ここ数年は Web ページで遭遇したことはないです。 (UTF-8CSVExcel で開こうとしたときには、文字化けを見ましたが...)

今や UTF-8 が主流なので、もう文字コードに悩まされることはないんだ。きっとそう。そう、であって欲しかった...。

パピコ問題

気まぐれで、同僚に以下の問題を出しました。

これらのパピコは同じでしょうか?

パピコ
パピコ

実は違うパピコです。

文字合成

UTF-8 には文字合成というものができます。 例えば「ハ」と半濁音を足して「パ」という文字を合成ができます。 一方、「パ」単体にも文字コードが割り当てられています。 それにより、「パ」には2通りの文字コードの書き方ができちゃうわけです。

このことを、実際に文字コード見ていきましょう。 ↑のパピコを papiko.txt に保存して、バイナリモードで見ていきます。

$ vim -b papiko.txt

vim でおまじないをかけることで、

:%!xxd

16進数でファイルの中身を見ることができました。

00000000: e383 8fe3 829a e383 92e3 829a e382 b30a  ................

00000010: e383 91e3 8394 e382 b30a                 ..........

1行目が1つ目のパピコ、2行目が2つ目のパピコを指しています(行末の 0a は改行コード)。

「ハ」の文字コードe3 83 8f で、半濁音の文字コードe3 82 9a であります。 また、「パ」の文字コードe3 83 91 であるので、各行の先頭を見ると対応していることがわかります。

これにより、内部的には違う文字扱いになるので、例えば検索とかかける際には注意が必要です。

文字一致判定

検索に気をつけないといけないですが、 Chrome ではそこらへん上手くしてくれています。 試しに、このページを Chrome で開いてブラウザ検索で「パピコ」と検索すると、以下のようにちゃんと両方とも検索されていました。

一方、このはてなブログで自動的にリンク付けされる機能ですが、文字合成の方のパピコにはリンクがつけられていません。 つまりは、文字合成と区別がされていることになります。

最後に

特にオチがある話ではないですが、同じ文字に見えても中身が違うことがあるということで、検索時などで罠にはまって悩むことがあるかもしれないというお話でした。

仲間を募集しております

募集中の職種については以下を御覧ください。

www.wantedly.com