You are viewing the version of this documentation from Perl 5.41.5. This is a development version of Perl.

CONTENTS

NAME

Encode::Unicode -- Various Unicode Transformation Formats

SYNOPSIS

use Encode qw/encode decode/;
$ucs2 = encode("UCS-2BE", $utf8);
$utf8 = decode("UCS-2BE", $ucs2);

ABSTRACT

This module implements all Character Encoding Schemes of Unicode that are officially documented by Unicode Consortium (except, of course, for UTF-8, which is a native format in perl).

http://www.unicode.org/glossary/ says:

Character Encoding Scheme A character encoding form plus byte serialization. There are Seven character encoding schemes in Unicode: UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32 (UCS-4), UTF-32BE (UCS-4BE) and UTF-32LE (UCS-4LE), and UTF-7.

Since UTF-7 is a 7-bit (re)encoded version of UTF-16BE, It is not part of Unicode's Character Encoding Scheme. It is separately implemented in Encode::Unicode::UTF7. For details see Encode::Unicode::UTF7.

Quick Reference
              Decodes from ord(N)           Encodes chr(N) to...
     octet/char BOM S.P d800-dfff  ord > 0xffff     \x{1abcd} ==
---------------+-----------------+------------------------------
UCS-2BE       2   N   N  is bogus                  Not Available
UCS-2LE       2   N   N     bogus                  Not Available
UTF-16      2/4   Y   Y  is   S.P           S.P            BE/LE
UTF-16BE    2/4   N   Y       S.P           S.P    0xd82a,0xdfcd
UTF-16LE    2/4   N   Y       S.P           S.P    0x2ad8,0xcddf
UTF-32        4   Y   -  is bogus         As is            BE/LE
UTF-32BE      4   N   -     bogus         As is       0x0001abcd
UTF-32LE      4   N   -     bogus         As is       0xcdab0100
UTF-8       1-4   -   -     bogus   >= 4 octets   \xf0\x9a\af\8d
---------------+-----------------+------------------------------

Size, Endianness, and BOM

You can categorize these CES by 3 criteria: size of each character, endianness, and Byte Order Mark.

by size

UCS-2 is a fixed-length encoding with each character taking 16 bits. It does not support surrogate pairs. When a surrogate pair is encountered during decode(), its place is filled with \x{FFFD} if CHECK is 0, or the routine croaks if CHECK is 1. When a character whose ord value is larger than 0xFFFF is encountered, its place is filled with \x{FFFD} if CHECK is 0, or the routine croaks if CHECK is 1.

UTF-16 is almost the same as UCS-2 but it supports surrogate pairs. When it encounters a high surrogate (0xD800-0xDBFF), it fetches the following low surrogate (0xDC00-0xDFFF) and desurrogates them to form a character. Bogus surrogates result in death. When \x{10000} or above is encountered during encode(), it ensurrogates them and pushes the surrogate pair to the output stream.

UTF-32 (UCS-4) is a fixed-length encoding with each character taking 32 bits. Since it is 32-bit, there is no need for surrogate pairs.

by endianness

The first (and now failed) goal of Unicode was to map all character repertoires into a fixed-length integer so that programmers are happy. Since each character is either a short or long in C, you have to pay attention to the endianness of each platform when you pass data to one another.

Anything marked as BE is Big Endian (or network byte order) and LE is Little Endian (aka VAX byte order). For anything not marked either BE or LE, a character called Byte Order Mark (BOM) indicating the endianness is prepended to the string.

CAVEAT: Though BOM in utf8 (\xEF\xBB\xBF) is valid, it is meaningless and as of this writing Encode suite just leave it as is (\x{FeFF}).