www.digitalmars.com

D Programming Language 2.0

Last update Wed Apr 11 21:24:36 2012

std.utf

Encode and decode UTF-8, UTF-16 and UTF-32 strings.

UTF character support is restricted to '\u0000' <= character <= '\U0010FFFF'.

See Also:
Wikipedia
http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
http://anubis.dkuug.dk/JTC1/SC2/WG2/docs/n1335

License:
Boost License 1.0.

Authors:
Walter Bright and Jonathan M Davis

Source:
std/utf.d

class UTFException: object.Exception;
Exception thrown on errors in std.utf functions.

alias UtfException;
Scheduled for deprecation in December 2012. Please use UTFException instead.

pure nothrow @safe bool isValidDchar(dchar c);
Returns whether c is a valid UTF-32 character.

'\uFFFE' and '\uFFFF' are considered valid by isValidDchar, as they are permitted for internal use by an application, but they are not allowed for interchange by the Unicode standard.

pure @safe uint stride(S)(in const(S) str, size_t index);
stride returns the length of the UTF-8 sequence starting at index in str.

Returns:
The number of bytes in the UTF-8 sequence.

Throws:
UTFException if str[index] is not the start of a valid UTF-8 sequence.

pure @safe uint strideBack(in char[] str, size_t index);
strideBack returns the length of the UTF-8 sequence ending one code unit before index in str.

Returns:
The number of bytes in the UTF-8 sequence.

Throws:
UTFException if str[index] is not one past the end of a valid UTF-8 sequence.

pure nothrow @safe uint stride(S)(in const(S) str, size_t index);
stride returns the length of the UTF-16 sequence starting at index in str.

Returns:
The number of bytes in the UTF-16 sequence.

pure @safe uint strideBack(in wchar[] str, size_t index);
strideBack returns the length of the UTF-16 sequence ending one code unit before index in str.

Returns:
The number of bytes in the UTF-16 sequence.

Throws:
UTFException if str[index] is not one past the end of a valid UTF-16 sequence.

pure nothrow @safe uint stride(S)(in const(S) str, size_t index);
stride returns the length of the UTF-32 sequence starting at index in str.

Returns:
The number of bytes in the UTF-32 sequence (always 1).

pure nothrow @safe uint strideBack(in dchar[] str, size_t index);
strideBack returns the length of the UTF-32 sequence ending one code unit before index in str.

Returns:
The number of bytes in the UTF-32 sequence (always 1).

pure @safe size_t toUCSindex(C)(const(C)[] str, size_t index);
Given index into str and assuming that index is at the start of a UTF sequence, toUCSindex determines the number of UCS characters up to index. So, index is the index of a code unit at the beginning of a code point, and the return value is how many code points into the string that that code point is.

Examples:
assert(toUCSindex(`hello world`, 7) == 7);
assert(toUCSindex(`hello world`w, 7) == 7);
assert(toUCSindex(`hello world`d, 7) == 7);

assert(toUCSindex(`Ma Chérie`, 7) == 6);
assert(toUCSindex(`Ma Chérie`w, 7) == 7);
assert(toUCSindex(`Ma Chérie`d, 7) == 7);

assert(toUCSindex(`さいごの果実 / ミツバチと科学者`, 9) == 3);
assert(toUCSindex(`さいごの果実 / ミツバチと科学者`w, 9) == 9);
assert(toUCSindex(`さいごの果実 / ミツバチと科学者`d, 9) == 9);

pure @safe size_t toUTFindex(in char[] str, size_t n);
pure nothrow @safe size_t toUTFindex(in wchar[] str, size_t n);
pure nothrow @safe size_t toUTFindex(in dchar[] str, size_t n);
Given a UCS index n into str, returns the UTF index. So, n is how many code points into the string the code point is, and the array index of the code unit is returned.

Examples:
assert(toUTFindex(`hello world`, 7) == 7);
assert(toUTFindex(`hello world`w, 7) == 7);
assert(toUTFindex(`hello world`d, 7) == 7);

assert(toUTFindex(`Ma Chérie`, 6) == 7);
assert(toUTFindex(`Ma Chérie`w, 7) == 7);
assert(toUTFindex(`Ma Chérie`d, 7) == 7);

assert(toUTFindex(`さいごの果実 / ミツバチと科学者`, 3) == 9);
assert(toUTFindex(`さいごの果実 / ミツバチと科学者`w, 9) == 9);
assert(toUTFindex(`さいごの果実 / ミツバチと科学者`d, 9) == 9);

pure @trusted dchar decode(S)(in const(S) str, ref size_t index);
pure @trusted dchar decode(S)(in const(S) str, ref size_t index);
pure @safe dchar decode(S)(in const(S) str, ref size_t index);
Decodes and returns the character starting at str[index]. index is advanced to one past the decoded character. If the character is not well-formed, then a UTFException is thrown and index remains unchanged.

Throws:
UTFException if str[index] is not the start of a valid UTF sequence.

pure @safe size_t encode(ref char[4u] buf, dchar c);
pure @safe size_t encode(ref wchar[2u] buf, dchar c);
Encodes c into the static array, buf, and returns the actual length of the encoded character (a number between 1 and 4 for char[4] buffers and a number between 1 and 2 for wchar[2] buffers.

Throws:
UTFException if c is not a valid UTF code point.

pure @safe void encode(ref char[] str, dchar c);
pure @safe void encode(ref wchar[] str, dchar c);
pure @safe void encode(ref dchar[] str, dchar c);
Encodes c in str's encoding and appends it to str.

Throws:
UTFException if c is not a valid UTF code point.

pure nothrow @safe ubyte codeLength(C)(dchar c);
Returns the number of code units that are required to encode the code point c when C is the character type used to encode it.

Examples:
assert(codeLength!char('a') == 1);
assert(codeLength!wchar('a') == 1);
assert(codeLength!dchar('a') == 1);

assert(codeLength!char('\U0010FFFF') == 4);
assert(codeLength!wchar('\U0010FFFF') == 2);
assert(codeLength!dchar('\U0010FFFF') == 1);

pure @safe void validate(S)(in const(S) str);
Checks to see if str is well-formed unicode or not.

Throws:
UTFException if str is not well-formed.

pure @safe string toUTF8(in char[] s);
pure @trusted string toUTF8(in wchar[] s);
pure @trusted string toUTF8(in dchar[] s);
Encodes string s into UTF-8 and returns the encoded string.

pure @trusted wstring toUTF16(in char[] s);
pure @safe wstring toUTF16(in wchar[] s);
pure @trusted wstring toUTF16(in dchar[] s);
Encodes string s into UTF-16 and returns the encoded string.

pure @trusted dstring toUTF32(in char[] s);
pure @trusted dstring toUTF32(in wchar[] s);
pure @safe dstring toUTF32(in dchar[] s);
Encodes string s into UTF-32 and returns the encoded string.

template toUTFz(P)
@system P toUTFz(P, S)(S str);
Returns a C-style zero-terminated string equivalent to str. str must not contain embedded '\0''s as any C function will treat the first '\0' that it sees a the end of the string. If str.empty is true, then a string containing only '\0' is returned.

toUTFz accepts any type of string and is templated on the type of character pointer that you wish to convert to. It will avoid allocating a new string if it can, but there's a decent chance that it will end up having to allocate a new string - particularly when dealing with character types other than char.

Warning 1: If the result of toUTFz equals str.ptr, then if anything alters the character one past the end of str (which is the '\0' character terminating the string), then the string won't be zero-terminated anymore. The most likely scenarios for that are if you append to str and no reallocation takes place or when str is a slice of a larger array, and you alter the character in the larger array which is one character past the end of str. Another case where it could occur would be if you had a mutable character array immediately after str in memory (for example, if they're member variables in a user-defined type with one declared right after the other) and that character array happened to start with '\0'. Such scenarios will never occur if you immediately use the zero-terminated string after calling toUTFz and the C function using it doesn't keep a reference to it. Also, they are unlikely to occur even if you save the zero-terminated string (the cases above would be among the few examples of where it could happen). However, if you save the zero-terminate string and want to be absolutely certain that the string stays zero-terminated, then simply append a '\0' to the string and use its ptr property rather than calling toUTFz.

Warning 2: When passing a character pointer to a C function, and the C function keeps it around for any reason, make sure that you keep a reference to it in your D code. Otherwise, it may go away during a garbage collection cycle and cause a nasty bug when the C code tries to use it.

Examples:
auto p1 = toUTFz!(char*)("hello world");
auto p2 = toUTFz!(const(char)*)("hello world");
auto p3 = toUTFz!(immutable(char)*)("hello world");
auto p4 = toUTFz!(char*)("hello world"d);
auto p5 = toUTFz!(const(wchar)*)("hello world");
auto p6 = toUTFz!(immutable(dchar)*)("hello world"w);

const(wchar)* toUTF16z(C)(const(C)[] str);
toUTF16z is a convenience function for toUTFz!(const(wchar)*).

Encodes string s into UTF-16 and returns the encoded string. toUTF16z is suitable for calling the 'W' functions in the Win32 API that take an LPWSTR or LPCWSTR argument.

pure @trusted size_t count(C)(const(C)[] str);
Returns the total number of code points encoded in str.

Supercedes:
This function supercedes toUCSindex.

Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252

Throws:
UTFException if str is not well-formed.