]> git.saurik.com Git - wxWidgets.git/blame - docs/doxygen/overviews/unicode.h
Implement hatched/stippled pens/brushes in wxGraphicsContext for Cairo.
[wxWidgets.git] / docs / doxygen / overviews / unicode.h
CommitLineData
15b6757b 1/////////////////////////////////////////////////////////////////////////////
2cd3cc94 2// Name: unicode.h
15b6757b
FM
3// Purpose: topic overview
4// Author: wxWidgets team
5// RCS-ID: $Id$
526954c5 6// Licence: wxWindows licence
15b6757b
FM
7/////////////////////////////////////////////////////////////////////////////
8
880efa2a 9/**
36c9828f 10
2cd3cc94
BP
11@page overview_unicode Unicode Support in wxWidgets
12
cc506697
VZ
13This section describes how does wxWidgets support Unicode and how can it affect
14your programs.
36c9828f 15
cc506697
VZ
16Notice that Unicode support has changed radically in wxWidgets 3.0 and a lot of
17existing material pertaining to the previous versions of the library is not
18correct any more. Please see @ref overview_changes_unicode for the details of
19these changes.
20
21You can skip the first two sections if you're already familiar with Unicode and
22wish to jump directly in the details of its support in the library:
2cd3cc94 23@li @ref overview_unicode_what
cc506697 24@li @ref overview_unicode_encodings
2cd3cc94 25@li @ref overview_unicode_supportin
cc506697 26@li @ref overview_unicode_pitfalls
2cd3cc94 27@li @ref overview_unicode_supportout
36c9828f 28
2cd3cc94 29<hr>
36c9828f
FM
30
31
2cd3cc94
BP
32@section overview_unicode_what What is Unicode?
33
cc506697 34Unicode is a standard for character encoding which addresses the shortcomings
77ef61f5
FM
35of the previous standards (e.g. the ASCII standard), by using 8, 16 or 32 bits
36for encoding each character.
37This allows enough code points (see below for the definition) sufficient to
38encode all of the world languages at once.
39More details about Unicode may be found at http://www.unicode.org/.
cc506697
VZ
40
41From a practical point of view, using Unicode is almost a requirement when
42writing applications for international audience. Moreover, any application
43reading files which it didn't produce or receiving data from the network from
44other services should be ready to deal with Unicode.
45
46
77ef61f5
FM
47@section overview_unicode_encodings Unicode Representations and Terminology
48
49When working with Unicode, it's important to define the meaning of some terms.
50
2f365fcb
FM
51A <b><em>glyph</em></b> is a particular image (usually part of a font) that
52represents a character or part of a character.
77ef61f5
FM
53Any character may have one or more glyph associated; e.g. some of the possible
54glyphs for the capital letter 'A' are:
55
56@image html overview_unicode_glyphs.png
57
58Unicode assigns each character of almost any existing alphabet/script a number,
727aa906 59which is called <b><em>code point</em></b>; it's typically indicated in documentation
77ef61f5
FM
60manuals and in the Unicode website as @c U+xxxx where @c xxxx is an hexadecimal number.
61
2f365fcb
FM
62Note that typically one character is assigned exactly one code point, but there
63are exceptions; the so-called <em>precomposed characters</em>
64(see http://en.wikipedia.org/wiki/Precomposed_character) or the <em>ligatures</em>.
65In these cases a single "character" may be mapped to more than one code point or
66viceversa more characters may be mapped to a single code point.
67
68The Unicode standard divides the space of all possible code points in <b><em>planes</em></b>;
77ef61f5
FM
69a plane is a range of 65,536 (1000016) contiguous Unicode code points.
70Planes are numbered from 0 to 16, where the first one is the @e BMP, or Basic
71Multilingual Plane.
727aa906
FM
72The BMP contains characters for all modern languages, and a large number of
73special characters. The other planes in fact contain mainly historic scripts,
74special-purpose characters or are unused.
77ef61f5
FM
75
76Code points are represented in computer memory as a sequence of one or more
727aa906 77<b><em>code units</em></b>, where a code unit is a unit of memory: 8, 16, or 32 bits.
77ef61f5
FM
78More precisely, a code unit is the minimal bit combination that can represent a
79unit of encoded text for processing or interchange.
80
2f365fcb 81The <b><em>UTF</em></b> or Unicode Transformation Formats are algorithms mapping the Unicode
77ef61f5 82code points to code unit sequences. The simplest of them is <b>UTF-32</b> where
727aa906
FM
83each code unit is composed by 32 bits (4 bytes) and each code point is always
84represented by a single code unit (fixed length encoding).
77ef61f5
FM
85(Note that even UTF-32 is still not completely trivial as the mapping is different
86for little and big-endian architectures). UTF-32 is commonly used under Unix systems for
87internal representation of Unicode strings.
88
89Another very widespread standard is <b>UTF-16</b> which is used by Microsoft Windows:
90it encodes the first (approximately) 64 thousands of Unicode code points
91(the BMP plane) using 16-bit code units (2 bytes) and uses a pair of 16-bit code
92units to encode the characters beyond this. These pairs are called @e surrogate.
727aa906 93Thus UTF16 uses a variable number of code units to encode each code point.
77ef61f5
FM
94
95Finally, the most widespread encoding used for the external Unicode storage
96(e.g. files and network protocols) is <b>UTF-8</b> which is byte-oriented and so
97avoids the endianness ambiguities of UTF-16 and UTF-32.
98UTF-8 uses code units of 8 bits (1 byte); code points beyond the usual english
99alphabet are represented using a variable number of bytes, which makes it less
100efficient than UTF-32 for internal representation.
101
102As visual aid to understand the differences between the various concepts described
103so far, look at the different UTF representations of the same code point:
104
105@image html overview_unicode_codes.png
106
107In this particular case UTF8 requires more space than UTF16 (3 bytes instead of 2).
108
109Note that from the C/C++ programmer perspective the situation is further complicated
110by the fact that the standard type @c wchar_t which is usually used to represent the
cc506697
VZ
111Unicode ("wide") strings in C/C++ doesn't have the same size on all platforms.
112It is 4 bytes under Unix systems, corresponding to the tradition of using
113UTF-32, but only 2 bytes under Windows which is required by compatibility with
114the OS which uses UTF-16.
2cd3cc94 115
77ef61f5
FM
116Typically when UTF8 is used, code units are stored into @c char types, since
117@c char are 8bit wide on almost all systems; when using UTF16 typically code
118units are stored into @c wchar_t types since @c wchar_t is at least 16bits on
119all systems. This is also the approach used by wxString.
727aa906 120See @ref overview_string for more info.
77ef61f5
FM
121
122See also http://unicode.org/glossary/ for the official definitions of the
123terms reported above.
124
2cd3cc94 125
cc506697 126@section overview_unicode_supportin Unicode Support in wxWidgets
2cd3cc94 127
bf0f2c4b
VZ
128@subsection overview_unicode_support_default Unicode is Always Used by Default
129
130Since wxWidgets 3.0 Unicode support is always enabled and while building the
131library without it is still possible, it is not recommended any longer and will
132cease to be supported in the near future. This means that internally only
133Unicode strings are used and that, under Microsoft Windows, Unicode system API
134is used which means that wxWidgets programs require the Microsoft Layer for
135Unicode to run on Windows 95/98/ME.
cc506697 136
77ef61f5
FM
137However, unlike the Unicode build mode of the previous versions of wxWidgets, this
138support is mostly transparent: you can still continue to work with the @b narrow
727aa906 139(i.e. current locale-encoded @c char*) strings even if @b wide
2f365fcb 140(i.e. UTF16-encoded @c wchar_t* or UTF8-encoded @c char*) strings are also
cc506697
VZ
141supported. Any wxWidgets function accepts arguments of either type as both
142kinds of strings are implicitly converted to wxString, so both
143@code
144wxMessageBox("Hello, world!");
145@endcode
77ef61f5 146and the somewhat less usual
cc506697 147@code
727aa906 148wxMessageBox(L"Salut \u00E0 toi!"); // U+00E0 is "Latin Small Letter a with Grave"
cc506697
VZ
149@endcode
150work as expected.
2cd3cc94 151
cc506697
VZ
152Notice that the narrow strings used with wxWidgets are @e always assumed to be
153in the current locale encoding, so writing
154@code
155wxMessageBox("Salut à toi!");
156@endcode
157wouldn't work if the encoding used on the user system is incompatible with
f99af6c0
VS
158ISO-8859-1 (or even if the sources were compiled under different locale
159in the case of gcc). In particular, the most common encoding used under
160modern Unix systems is UTF-8 and as the string above is not a valid UTF-8 byte
161sequence, nothing would be displayed at all in this case. Thus it is important
77ef61f5 162to <b>never use 8-bit (instead of 7-bit) characters directly in the program source</b>
727aa906 163but use wide strings or, alternatively, write:
cc506697 164@code
727aa906
FM
165wxMessageBox(wxString::FromUTF8("Salut \xC3\xA0 toi!"));
166 // in UTF8 the character U+00E0 is encoded as 0xC3A0
cc506697 167@endcode
2cd3cc94 168
77ef61f5
FM
169In a similar way, wxString provides access to its contents as either @c wchar_t or
170@c char character buffer. Of course, the latter only works if the string contains
cc506697
VZ
171data representable in the current locale encoding. This will always be the case
172if the string had been initially constructed from a narrow string or if it
173contains only 7-bit ASCII data but otherwise this conversion is not guaranteed
91fa0da4
FM
174to succeed. And as with wxString::FromUTF8() example above, you can always use
175wxString::ToUTF8() to retrieve the string contents in UTF-8 encoding -- this,
176unlike converting to @c char* using the current locale, never fails.
cc506697 177
77ef61f5
FM
178For more info about how wxString works, please see the @ref overview_string.
179
180To summarize, Unicode support in wxWidgets is mostly @b transparent for the
cc506697
VZ
181application and if you use wxString objects for storing all the character data
182in your program there is really nothing special to do. However you should be
183aware of the potential problems covered by the following section.
184
185
bf0f2c4b
VZ
186@subsection overview_unicode_support_utf Choosing Unicode Representation
187
188wxWidgets uses the system @c wchar_t in wxString implementation by default
189under all systems. Thus, under Microsoft Windows, UCS-2 (simplified version of
190UTF-16 without support for surrogate characters) is used as @c wchar_t is 2
191bytes on this platform. Under Unix systems, including Mac OS X, UCS-4 (also
192known as UTF-32) is used by default, however it is also possible to build
193wxWidgets to use UTF-8 internally by passing @c --enable-utf8 option to
194configure.
195
196The interface provided by wxString is the same independently of the format used
197internally. However different formats have specific advantages and
198disadvantages. Notably, under Unix, the underlying graphical toolkit (e.g.
199GTK+) usually uses UTF-8 encoded strings and using the same representations for
200the strings in wxWidgets allows to avoid conversion from UTF-32 to UTF-8 and
201vice versa each time a string is shown in the UI or retrieved from it. The
202overhead of such conversions is usually negligible for small strings but may be
203important for some programs. If you believe that it would be advantageous to
204use UTF-8 for the strings in your particular application, you may rebuild
205wxWidgets to use UTF-8 as explained above (notice that this is currently not
206supported under Microsoft Windows and arguably doesn't make much sense there as
207Windows itself uses UTF-16 and not UTF-8) but be sure to be aware of the
208performance implications (see @ref overview_unicode_performance) of using UTF-8
209in wxString before doing this!
210
211Generally speaking you should only use non-default UTF-8 build in specific
212circumstances e.g. building for resource-constrained systems where the overhead
213of conversions (and also reduced memory usage of UTF-8 compared to UTF-32 for
214the European languages) can be important. If the environment in which your
215program is running is under your control -- as is quite often the case in such
216scenarios -- consider ensuring that the system always uses UTF-8 locale and
217use @c --enable-utf8only configure option to disable support for the other
218locales and consider all strings to be in UTF-8. This further reduces the code
219size and removes the need for conversions in more cases.
220
221
222@subsection overview_unicode_settings Unicode Related Preprocessor Symbols
223
224@c wxUSE_UNICODE is defined as 1 now to indicate Unicode support. It can be
225explicitly set to 0 in @c setup.h under MSW or you can use @c --disable-unicode
226under Unix but doing this is strongly discouraged. By default, @c
227wxUSE_UNICODE_WCHAR is also defined as 1, however in UTF-8 build (described in
228the previous section), it is set to 0 and @c wxUSE_UNICODE_UTF8, which is
229usually 0, is set to 1 instead. In the latter case, @c wxUSE_UTF8_LOCALE_ONLY
230can also be set to 1 to indicate that all strings are considered to be in UTF-8.
231
232
233
cc506697
VZ
234@section overview_unicode_pitfalls Potential Unicode Pitfalls
235
236The problems can be separated into three broad classes:
237
238@subsection overview_unicode_compilation_errors Unicode-Related Compilation Errors
239
77ef61f5
FM
240Because of the need to support implicit conversions to both @c char and
241@c wchar_t, wxString implementation is rather involved and many of its operators
242don't return the types which they could be naively expected to return.
243For example, the @c operator[] doesn't return neither a @c char nor a @c wchar_t
cc506697
VZ
244but an object of a helper class wxUniChar or wxUniCharRef which is implicitly
245convertible to either. Usually you don't need to worry about this as the
246conversions do their work behind the scenes however in some cases it doesn't
247work. Here are some examples, using a wxString object @c s and some integer @c
248n:
249
250 - Writing @code switch ( s[n] ) @endcode doesn't work because the argument of
d9384bfb 251 the switch statement must be an integer expression so you need to replace
cc506697 252 @c s[n] with @code s[n].GetValue() @endcode. You may also force the
77ef61f5 253 conversion to @c char or @c wchar_t by using an explicit cast but beware that
cc506697
VZ
254 converting the value to char uses the conversion to current locale and may
255 return 0 if it fails. Finally notice that writing @code (wxChar)s[n] @endcode
256 works both with wxWidgets 3.0 and previous library versions and so should be
257 used for writing code which should be compatible with both 2.8 and 3.0.
258
259 - Similarly, @code &s[n] @endcode doesn't yield a pointer to char so you may
260 not pass it to functions expecting @c char* or @c wchar_t*. Consider using
261 string iterators instead if possible or replace this expression with
262 @code s.c_str() + n @endcode otherwise.
263
91fa0da4
FM
264Another class of problems is related to the fact that the value returned by
265@c c_str() itself is also not just a pointer to a buffer but a value of helper
cc506697
VZ
266class wxCStrData which is implicitly convertible to both narrow and wide
267strings. Again, this mostly will be unnoticeable but can result in some
268problems:
269
270 - You shouldn't pass @c c_str() result to vararg functions such as standard
271 @c printf(). Some compilers (notably g++) warn about this but even if they
272 don't, this @code printf("Hello, %s", s.c_str()) @endcode is not going to
273 work. It can be corrected in one of the following ways:
274
275 - Preferred: @code wxPrintf("Hello, %s", s) @endcode (notice the absence
276 of @c c_str(), it is not needed at all with wxWidgets functions)
277 - Compatible with wxWidgets 2.8: @code wxPrintf("Hello, %s", s.c_str()) @endcode
278 - Using an explicit conversion to narrow, multibyte, string:
f99af6c0 279 @code printf("Hello, %s", (const char *)s.mb_str()) @endcode
cc506697
VZ
280 - Using a cast to force the issue (listed only for completeness):
281 @code printf("Hello, %s", (const char *)s.c_str()) @endcode
282
4c51a665 283 - The result of @c c_str() cannot be cast to @c char* but only to @c const @c
cc506697
VZ
284 @c char*. Of course, modifying the string via the pointer returned by this
285 method has never been possible but unfortunately it was occasionally useful
286 to use a @c const_cast here to pass the value to const-incorrect functions.
287 This can be done either using new wxString::char_str() (and matching
288 wchar_str()) method or by writing a double cast:
289 @code (char *)(const char *)s.c_str() @endcode
290
291 - One of the unfortunate consequences of the possibility to pass wxString to
292 @c wxPrintf() without using @c c_str() is that it is now impossible to pass
293 the elements of unnamed enumerations to @c wxPrintf() and other similar
294 vararg functions, i.e.
295 @code
296 enum { Red, Green, Blue };
297 wxPrintf("Red is %d", Red);
298 @endcode
299 doesn't compile. The easiest workaround is to give a name to the enum.
300
301Other unexpected compilation errors may arise but they should happen even more
302rarely than the above-mentioned ones and the solution should usually be quite
303simple: just use the explicit methods of wxUniChar and wxCStrData classes
304instead of relying on their implicit conversions if the compiler can't choose
305among them.
306
307
308@subsection overview_unicode_data_loss Data Loss due To Unicode Conversion Errors
309
310wxString API provides implicit conversion of the internal Unicode string
311contents to narrow, char strings. This can be very convenient and is absolutely
312necessary for backwards compatibility with the existing code using wxWidgets
313however it is a rather dangerous operation as it can easily give unexpected
314results if the string contents isn't convertible to the current locale.
315
316To be precise, the conversion will always succeed if the string was created
317from a narrow string initially. It will also succeed if the current encoding is
318UTF-8 as all Unicode strings are representable in this encoding. However
91fa0da4
FM
319initializing the string using wxString::FromUTF8() method and then accessing it
320as a char string via its wxString::c_str() method is a recipe for disaster as the
321program may work perfectly well during testing on Unix systems using UTF-8 locale
322but completely fail under Windows where UTF-8 locales are never used because
323wxString::c_str() would return an empty string.
cc506697
VZ
324
325The simplest way to ensure that this doesn't happen is to avoid conversions to
326@c char* completely by using wxString throughout your program. However if the
327program never manipulates 8 bit strings internally, using @c char* pointers is
328safe as well. So the existing code needs to be reviewed when upgrading to
329wxWidgets 3.0 and the new code should be used with this in mind and ideally
330avoiding implicit conversions to @c char*.
331
332
bf0f2c4b 333@subsection overview_unicode_performance Performance Implications of Using UTF-8
cc506697 334
bf0f2c4b
VZ
335As mentioned above, under Unix systems wxString class can use variable-width
336UTF-8 encoding for internal representation. In this case it can't guarantee
337constant-time access to N-th element of the string any longer as to find the
338position of this character in the string we have to examine all the preceding
339ones. Usually this doesn't matter much because most algorithms used on the
340strings examine them sequentially anyhow and because wxString implements a
341cache for iterating over the string by index but it can have serious
342consequences for algorithms using random access to string elements as they
343typically acquire O(N^2) time complexity instead of O(N) where N is the length
344of the string.
cc506697 345
a6919a6a 346Even despite caching the index, indexed access should be replaced with
cc506697 347sequential access using string iterators. For example a typical loop:
7b74e828 348@code
cc506697
VZ
349wxString s("hello");
350for ( size_t i = 0; i < s.length(); i++ )
7b74e828 351{
cc506697 352 wchar_t ch = s[i];
91fa0da4 353
7b74e828
RR
354 // do something with it
355}
356@endcode
cc506697 357should be rewritten as
2cd3cc94 358@code
cc506697
VZ
359wxString s("hello");
360for ( wxString::const_iterator i = s.begin(); i != s.end(); ++i )
7b74e828 361{
cc506697 362 wchar_t ch = *i
91fa0da4 363
7b74e828
RR
364 // do something with it
365}
2cd3cc94
BP
366@endcode
367
cc506697 368Another, similar, alternative is to use pointer arithmetic:
7b74e828 369@code
cc506697
VZ
370wxString s("hello");
371for ( const wchar_t *p = s.wc_str(); *p; p++ )
7b74e828 372{
cc506697
VZ
373 wchar_t ch = *i
374
375 // do something with it
7b74e828
RR
376}
377@endcode
cc506697
VZ
378however this doesn't work correctly for strings with embedded @c NUL characters
379and the use of iterators is generally preferred as they provide some run-time
380checks (at least in debug build) unlike the raw pointers. But if you do use
77ef61f5 381them, it is better to use @c wchar_t pointers rather than @c char ones to avoid the
cc506697 382data loss problems due to conversion as discussed in the previous section.
2cd3cc94 383
2cd3cc94 384
cc506697 385@section overview_unicode_supportout Unicode and the Outside World
2cd3cc94 386
cc506697
VZ
387Even though wxWidgets always uses Unicode internally, not all the other
388libraries and programs do and even those that do use Unicode may use a
389different encoding of it. So you need to be able to convert the data to various
91fa0da4
FM
390representations and the wxString methods wxString::ToAscii(), wxString::ToUTF8()
391(or its synonym wxString::utf8_str()), wxString::mb_str(), wxString::c_str() and
392wxString::wc_str() can be used for this.
727aa906 393
91fa0da4
FM
394The first of them should be only used for the string containing 7-bit ASCII characters
395only, anything else will be replaced by some substitution character.
396wxString::mb_str() converts the string to the encoding used by the current locale
397and so can return an empty string if the string contains characters not representable in
398it as explained in @ref overview_unicode_data_loss. The same applies to wxString::c_str()
399if its result is used as a narrow string. Finally, wxString::ToUTF8() and wxString::wc_str()
cc506697 400functions never fail and always return a pointer to char string containing the
77ef61f5 401UTF-8 representation of the string or @c wchar_t string.
cc506697 402
91fa0da4
FM
403wxString also provides two convenience functions: wxString::From8BitData() and
404wxString::To8BitData(). They can be used to create a wxString from arbitrary binary
405data without supposing that it is in current locale encoding, and then get it back,
cc506697 406again, without any conversion or, rather, undoing the conversion used by
91fa0da4
FM
407wxString::From8BitData(). Because of this you should only use wxString::From8BitData()
408for the strings created using wxString::To8BitData(). Also notice that in spite
409of the availability of these functions, wxString is not the ideal class for storing
cc506697
VZ
410arbitrary binary data as they can take up to 4 times more space than needed
411(when using @c wchar_t internal representation on the systems where size of
412wide characters is 4 bytes) and you should consider using wxMemoryBuffer
413instead.
414
415Final word of caution: most of these functions may return either directly the
416pointer to internal string buffer or a temporary wxCharBuffer or wxWCharBuffer
77ef61f5 417object. Such objects are implicitly convertible to @c char and @c wchar_t pointers,
91fa0da4 418respectively, and so the result of, for example, wxString::ToUTF8() can always be
77ef61f5 419passed directly to a function taking <tt>const char*</tt>. However code such as
7b74e828 420@code
cc506697
VZ
421const char *p = s.ToUTF8();
422...
423puts(p); // or call any other function taking const char *
7b74e828 424@endcode
91fa0da4 425does @b not work because the temporary buffer returned by wxString::ToUTF8() is
197380a0 426destroyed and @c p is left pointing nowhere. To correct this you should use
7b74e828 427@code
197380a0 428const wxScopedCharBuffer p(s.ToUTF8());
cc506697 429puts(p);
7b74e828 430@endcode
197380a0
VS
431which does work.
432
91fa0da4 433Similarly, wxWX2WCbuf can be used for the return type of wxString::wc_str().
cc506697
VZ
434But, once again, none of these cryptic types is really needed if you just pass
435the return value of any of the functions mentioned in this section to another
436function directly.
2cd3cc94 437
2cd3cc94
BP
438*/
439