質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

1回答

1193閲覧

UTF-16 の「サロゲートペア」について

abroad128

総合スコア60

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

2クリップ

投稿2021/01/27 14:24

編集2021/01/27 14:26

Unicodeにおいて、UTF-8でも複数符号単位を使って表現する文字があるにも関わらず、UTF-16だけ2符号単位で文字を表現するときにはサロゲートペアという呼び名が付けられてるのは何故でしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Unicode 登場時点って、文字集合と符号化方式がイコールだったんですよ。
文字集合は16ビット。符号化方式も文字集合のコード体系と同じ。
なので最初は UTF-16 という言葉さえなかった。
例えば「あ」は U+3042。いまで言う UTF-16 でも 0x3042。同じ。

その後、全然文字数足らんじゃないかと騒動になり文字集合が 32ビットとなった。

これまでの符号化方式をなかったことにするわけにはいかない、とはいえ
16ビットでは収まらない。なので符号化方式に無理やりサロゲートペアを
追加したが、それを UTF-16と呼びましょうということにした (ここで
はじめて文字集合と符号化方式のコード体系が分かれた)。

UTF-8 や UTF-32 は 32ビット化騒動以降にできたものなので、
サロゲートペアという変なしくみはない。

ちなみに UCS-4(文字集合) と UTF-8 (符号化方式) の対応はこんな感じです。

UCS-4 (16進数) UTF-8 (2進数) ----------------- --------------------------------------- 00000000-0000007F 0xxxxxxx 00000080-000007FF 110xxxxx 10xxxxxx 00000800-0000FFFF 1110xxxx 10xxxxxx 10xxxxxx 00010000-001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

16進数の 7 は 3bit、F は 4bit で表現できるので、
例えば UCS-4 の 000007FF は 3bit+4bit+4bit=11bit。
対する右側 2進数の x の個数は 11個なので、11bit。

よって、UCS-4 のビットを少々移動するだけで UTF-8 になります。
これが UTF-8 にはサロゲートペアという変な仕組みはない、ということです。

以上、お詳しい方がみたら怒られそうな不正確な表現がたくさんあると思いますので、雰囲気だけお感じいただければと思います。

投稿2021/01/27 14:56

編集2021/01/27 15:14
68user

総合スコア2005

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問