summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorJarkko Hietaniemi <jhi@iki.fi>2001-11-10 15:15:29 +0000
committerJarkko Hietaniemi <jhi@iki.fi>2001-11-10 15:15:29 +0000
commit7a4efbb2994f7a46ffdcc9d9a4730a93332c577a (patch)
treee85eb20b2c9b8102f83cc44554948249f9911827 /ext
parent3e16932524becaa89351f54bcab041596f67d434 (diff)
downloadperl-7a4efbb2994f7a46ffdcc9d9a4730a93332c577a.tar.gz
Document the UTF-16 surrogate encoding and decoding.
p4raw-id: //depot/perl@12932
Diffstat (limited to 'ext')
-rw-r--r--ext/Encode/Encode.pm14
1 files changed, 13 insertions, 1 deletions
diff --git a/ext/Encode/Encode.pm b/ext/Encode/Encode.pm
index 863022b18f..f2116c54e4 100644
--- a/ext/Encode/Encode.pm
+++ b/ext/Encode/Encode.pm
@@ -728,9 +728,21 @@ For CHECK see L</"Handling Malformed Data">.
=head2 Other Encodings of Unicode
UTF-16 is similar to UCS-2, 16 bit or 2-byte chunks. UCS-2 can only
-represent 0..0xFFFF, while UTF-16 has a "surrogate pair" scheme which
+represent 0..0xFFFF, while UTF-16 has a I<surrogate pair> scheme which
allows it to cover the whole Unicode range.
+Surrogates are code points set aside to encode the 0x01000..0x10FFFF
+range of Unicode code points in pairs of 16-bit units. The I<high
+surrogates> are the range 0xD800..0xDBFF, and the I<low surrogates>
+are the range 0xDC00..0xDFFFF. The surrogate encoding is
+
+ $hi = ($uni - 0x10000) / 0x400 + 0xD800;
+ $lo = ($uni - 0x10000) % 0x400 + 0xDC00;
+
+and the decoding is
+
+ $uni = 0x10000 + ($hi - 0xD8000) * 0x400 + ($lo - 0xDC00);
+
Encode implements big-endian UCS-2 aliased to "iso-10646-1" as that
happens to be the name used by that representation when used with X11
fonts.