Home | All Classes | Main Classes | Annotated | Grouped Classes | Functions |
The TQTextCodec class provides conversion between text encodings. More...
Almost all the functions in this class are reentrant when TQt is built with thread support. The exceptions are ~TQTextCodec(), setCodecForTr(), setCodecForCStrings(), and TQTextCodec().
#include <qtextcodec.h>
Inherited by TQBig5Codec, TQBig5hkscsCodec, TQEucJpCodec, TQEucKrCodec, TQGb18030Codec, TQJisCodec, TQHebrewCodec, TQSjisCodec, and TQTsciiCodec.
TQt uses Unicode to store, draw and manipulate strings. In many situations you may wish to deal with data that uses a different encoding. For example, most Japanese documents are still stored in Shift-JIS or ISO2022, while Russian users often have their documents in KOI8-R or CP1251.
TQt provides a set of TQTextCodec classes to help with converting non-Unicode formats to and from Unicode. You can also create your own codec classes (see later).
The supported encodings are:
TQTextCodecs can be used as follows to convert some locally encoded string to Unicode. Suppose you have some string encoded in Russian KOI8-R encoding, and want to convert it to Unicode. The simple way to do this is:
TQCString locallyEncoded = "..."; // text to convert TQTextCodec *codec = TQTextCodec::codecForName("KOI8-R"); // get the codec for KOI8-R TQString unicodeString = codec->toUnicode( locallyEncoded );
After this, unicodeString holds the text converted to Unicode. Converting a string from Unicode to the local encoding is just as easy:
TQString unicodeString = "..."; // any Unicode text TQTextCodec *codec = TQTextCodec::codecForName("KOI8-R"); // get the codec for KOI8-R TQCString locallyEncoded = codec->fromUnicode( unicodeString );
Some care must be taken when trying to convert the data in chunks, for example, when receiving it over a network. In such cases it is possible that a multi-byte character will be split over two chunks. At best this might result in the loss of a character and at worst cause the entire conversion to fail.
The approach to use in these situations is to create a TQTextDecoder object for the codec and use this TQTextDecoder for the whole decoding process, as shown below:
TQTextCodec *codec = TQTextCodec::codecForName( "Shift-JIS" ); TQTextDecoder *decoder = codec->makeDecoder(); TQString unicodeString; while( receiving_data ) { TQByteArray chunk = new_data; unicodeString += decoder->toUnicode( chunk.data(), chunk.length() ); }
The TQTextDecoder object maintains state between chunks and therefore works correctly even if a multi-byte character is split between chunks.
Support for new text encodings can be added to TQt by creating TQTextCodec subclasses.
Built-in codecs can be overridden by custom codecs since more recently created TQTextCodec objects take precedence over earlier ones.
You may find it more convenient to make your codec class available as a plugin; see the plugin documentation for more details.
The abstract virtual functions describe the encoder to the system and the coder is used as required in the different text file formats supported by TQTextStream, and under X11, for the locale-specific character input and output.
To add support for another 8-bit encoding to TQt, make a subclass of TQTextCodec and implement at least the following methods:
const char* name() constReturn the official name for the encoding.
int mibEnum() constReturn the MIB enum for the encoding if it is listed in the IANA character-sets encoding file.
If the encoding is multi-byte then it will have "state"; that is, the interpretation of some bytes will be dependent on some preceding bytes. For such encodings, you must implement:
TQTextDecoder* makeDecoder() constReturn a TQTextDecoder that remembers incomplete multi-byte sequence prefixes or other required state.
If the encoding does not require state, you should implement:
TQString toUnicode(const char* chars, int len) constConverts len characters from chars to Unicode.
The base TQTextCodec class has default implementations of the above two functions, but they are mutually recursive, so you must re-implement at least one of them, or both for improved efficiency.
For conversion from Unicode to 8-bit encodings, it is rarely necessary to maintain state. However, two functions similar to the two above are used for encoding:
TQTextEncoder* makeEncoder() constReturn a TQTextEncoder.
TQCString fromUnicode(const TQString& uc, int& lenInOut ) constConverts lenInOut characters (of type TQChar) from the start of the string uc, returning a TQCString result, and also returning the length of the result in lenInOut.
Again, these are mutually recursive so only one needs to be implemented, or both if greater efficiency is possible.
Finally, you must implement:
int heuristicContentMatch(const char* chars, int len) constGives a value indicating how likely it is that len characters from chars are in the encoding.
A good model for this function is the TQWindowsLocalCodec::heuristicContentMatch function found in the TQt sources.
A TQTextCodec subclass might have improved performance if you also re-implement:
bool canEncode( TQChar ) constTest if a Unicode character can be encoded.
bool canEncode( const TQString& ) constTest if a string of Unicode characters can be encoded.
int heuristicNameMatch(const char* hint) constTest if a possibly non-standard name is referring to the codec.
Codecs can also be created as plugins.
See also Internationalization with TQt.
Warning: This function is not reentrant.
Constructs a TQTextCodec, and gives it the highest precedence. The TQTextCodec should always be constructed on the heap (i.e. with new). TQt takes ownership and will delete it when the application terminates.
Warning: This function is not reentrant.
Destroys the TQTextCodec. Note that you should not delete codecs yourself: once created they become TQt's responsibility.
s contains the string being tested for encode-ability.
Returns the codec used by TQString to convert to and from const char* and TQCStrings. If this function returns 0 (the default), TQString assumes Latin-1.
See also setCodecForCStrings().
Note that this is often a poor choice, since character encodings often use most of the available character sequences, and so only by linguistic analysis could a true match be made.
chars contains the string to check, and len contains the number of characters in the string to use.
See also heuristicContentMatch().
Example: qwerty/qwerty.cpp.
Example: qwerty/qwerty.cpp.
Example: qwerty/qwerty.cpp.
See also heuristicNameMatch().
Returns the codec used by TQObject::tr() on its argument. If this function returns 0 (the default), tr() assumes Latin-1.
See also setCodecForTr().
Warning: Do not call this function.
TQApplication calls this function just before exiting to delete any TQTextCodec objects that may be lying around. Since various other classes hold pointers to TQTextCodec objects, it is not safe to call this function earlier.
If you are using the utility classes (like TQString) but not using TQApplication, calling this function at the very end of your application may be helpful for chasing down memory leaks by eliminating any TQTextCodec objects.
Converts lenInOut characters (not bytes) from uc, producing a TQCString. lenInOut will be set to the length of the result (in bytes).
The default implementation makes an encoder with makeEncoder() and converts the input with that. Note that the default makeEncoder() implementation makes an encoder that simply calls this function, hence subclasses must reimplement one function or the other to avoid infinite recursion.
Reimplemented in TQHebrewCodec.
uc is the unicode source string.
TQTextCodec subclasses must reimplement this function. It examines the first len bytes of chars and returns a value indicating how likely it is that the string is a prefix of text encoded in the encoding of the subclass. A negative return value indicates that the text is detectably not in the encoding (e.g. it contains characters undefined in the encoding). A return value of 0 indicates that the text should be decoded with this codec rather than as ASCII, but there is no particular evidence. The value should range up to len. Thus, most decoders will return -1, 0, or -len.
The characters are not null terminated.
See also codecForContent().
A good match returns a positive number around the length of the string. A bad match is negative.
The default implementation calls simpleHeuristicNameMatch() with the name of the codec.
<code_set_name> name <escape_char> character % alias alias CHARMAP <token> /xhexbyte <Uunicode> ... <token> /ddecbyte <Uunicode> ... <token> /octbyte <Uunicode> ... <token> /any/any... <Uunicode> ... END CHARMAP
The resulting TQTextCodec is returned (and also added to the global list of codecs). The name() of the result is taken from the code_set_name.
Note that a codec constructed in this way uses much more memory and is slower than a hand-written TQTextCodec subclass, since tables in code are kept in memory shared by all TQt applications.
See also loadCharmapFile().
Example: qwerty/qwerty.cpp.
Example: i18n/main.cpp.
The caller is responsible for deleting the returned object.
The caller is responsible for deleting the returned object.
Subclasses of TQTextCodec must reimplement this function. It returns the MIBenum (see the IANA character-sets encoding file for more information). It is important that each TQTextCodec subclass returns the correct unique value for this function.
Reimplemented in TQEucJpCodec.
Reimplemented in TQEucJpCodec, TQEucKrCodec, TQJisCodec, TQHebrewCodec, and TQSjisCodec.
TQTextCodec subclasses must reimplement this function. It returns the name of the encoding supported by the subclass. When choosing a name for an encoding, consider these points:
Example: qwerty/qwerty.cpp.
Warning: This function is not reentrant.
Sets the codec used by TQString to convert to and from const char* and TQCStrings. If c is 0 (the default), TQString assumes Latin-1.
Warning: Some codecs do not preserve the characters in the ascii range (0x00 to 0x7f). For example, the Japanese Shift-JIS encoding maps the backslash character (0x5a) to the Yen character. This leads to unexpected results when using the backslash character to escape characters in strings used in e.g. regular expressions. Use TQString::fromLatin1() to preserve characters in the ascii range when needed.
See also codecForCStrings() and setCodecForTr().
See also codecForLocale().
Warning: This function is not reentrant.
Sets the codec used by TQObject::tr() on its argument to c. If c is 0 (the default), tr() assumes Latin-1.
If the literal quoted text in the program is not in the Latin-1 encoding, this function can be used to set the appropriate encoding. For example, software developed by Korean programmers might use eucKR for all the text in the program, in which case the main() function might look like this:
int main(int argc, char** argv) { TQApplication app(argc, argv); ... install any additional codecs ... TQTextCodec::setCodecForTr( TQTextCodec::codecForName("eucKR") ); ... }
Note that this is not the way to select the encoding that the user has chosen. For example, to convert an application containing literal English strings to Korean, all that is needed is for the English strings to be passed through tr() and for translation files to be loaded. For details of internationalization, see the TQt internationalization documentation.
See also codecForTr() and setCodecForCStrings().
The default implementation makes a decoder with makeDecoder() and converts the input with that. Note that the default makeDecoder() implementation makes a decoder that simply calls this function, hence subclasses must reimplement one function or the other to avoid infinite recursion.
a contains the source characters; len contains the number of characters in a to use.
a contains the source characters.
a contains the source characters; len contains the number of characters in a to use.
a contains the source characters.
chars contains the source characters.
This file is part of the TQt toolkit. Copyright © 1995-2007 Trolltech. All Rights Reserved.
Copyright © 2007 Trolltech | Trademarks | TQt 3.3.8
|