Help us understand the problem. What is going on with this article?

UTF-8とサロゲートペアって関係あるの?

TL;DR

関係ないです。

はじめに

サロゲートペアってよく分からんけど、UTF-8使うときに気にしないといけないものなの?
を調べたときによく分からなかったので、同じようにハマった人の手助けになれば。

Unicodeって?

世界中の文字を全部詰め込んだ文字セット(文字コードの集合)を作ろうぜ!
というコンセプトで作られたものです。
今もなおどんどんアップデートされ、文字が追加されています。
(最近は絵文字とかが追加されている)
たとえば「あ」だったら、U+3042に割り当てられます。
その他の例は以下です。

文字 Unicode
A U+41
Ω U+3A9
U+8A9E
😊 U+1F60A

UTF-8とかUTF-16とかUTF-32って?

エンコード方式。
文字をどうやってデータに変換するかのルール。
UTF-8:文字を8ビット単位に変換する。
UTF-16:文字を16ビットに変換する。
UTF-32:文字を32ビットに変換する。
実際に変換した例が以下です。

文字 Unicode UTF-8 UTF-16 UTF-32
A U+41 41 0041 00000041
Ω U+3A9 CE A9 03A9 000003A9
U+8A9E E8 AA 9E 8A9E 00008A9E
😊 U+1F60A F0 9F 98 8A D83D DE0A 0001F60A

あれ?なんか1人ルール違反してる人がいますね。
ただ、大人の世界では、ルール違反が起きたら、ルールのほうを変えてしまうことがあります。
この例外ルールがサロゲートペアです。

サロゲートペアって?

Unicodeはどんどん文字を追加しているうちに、16ビットでは表現しきれない情報量になってしまいました。
でも、UTF-16:文字を16ビットに変換する。というのはもう決めてしまっていた後なので、なんとかしないといけません。
そこで、2文字で1文字を表現しよう!となりました。
人間、追い詰められるとワケ分からんこと言い出しますね。
2文字だから「ペア」です。
#サロゲートの意味は「代理」だそうです。

まとめ

UTF-8は8ビット単位でエンコードを行うため、16ビットを超える文字でも問題なく変換することができます。
つまり、UTF-8にサロゲートペアはありません。
#同様に、UTF-32にもサロゲートペアはありません。

rin_kirihara
バッドエンドエンジニア。 制御系の会社でWeb系の仕事をしています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away