Unicode
1980年代の当初の構想では、Unicodeは16ビット固定長で、2 = 6万5,536 個の符号位置に必要な全ての文字を収録する、というもくろみであった。しかし、Unicode 1.0公表後、拡張可能な空き領域2万字分を巡り、各国から文字追加要求が起こった。その内容は中国、日本、台湾、ベトナム、シンガポールの追加漢字約1万5千字、古ハングル約5千字、未登録言語の文字などである。このようにしてUnicodeの、16ビットの枠内に全世界の文字を収録するという計画は早々に破綻し、1996年のUnicode 2.0の時点で既に、文字集合の空間を16ビットから広げることが決まった。この時、それまでの16ビットを前提としてすでに設計されていたシステム(たとえばJavaのchar型や、Windows NT・Windows 95のAPI)をなるべくそのままにしたまま、広げられた空間にある符号位置を表現する方法として、サロゲートペアが定義された。
「𠮷」U+20BB7 のエンコードを考えてみる。 0010 0000 10 11 1011 0111 2 ( 20 B B 7 16 ) {\displaystyle {\color {green}0010\ 0000\ 10}{\color {blue}11\ 1011\ 0111}_{2}\ ({\rm {20BB7}}_{16})} から 0001 0000 0000 0000 0000 2 ( 10000 16 ) {\displaystyle 0001\ 0000\ 0000\ 0000\ 0000_{2}\ (10000_{16})} を引くと、結果は 0001 0000 10 11 1011 0111 2 ( 10 B B 7 16 ) {\displaystyle {\color {green}0001\ 0000\ 10}{\color {blue}11\ 1011\ 0111}_{2}\ ({\rm {10BB7}}_{16})} となる。
これを上位10ビット値と下位10ビット値に分割する。 0001 0000 10 2 ( 0042 16 ) , 11 1011 0111 2 ( 03 B 7 16 ) {\displaystyle {\color {green}0001\ 0000\ 10}_{2}\ ({\color {green}0042}_{16}),\ \ {\color {blue}11\ 1011\ 0111}_{2}\ ({\rm {\color {blue}03B7}}_{16})}