返回介绍

QTextCodec Class

发布于 2019-10-04 15:03:20 字数 20816 浏览 937 评论 0 收藏 0

The QTextCodec class provides conversion between text encodings. More...

#include <qtextcodec.h>

Inherited by QEucJpCodec, QEucKrCodec, QGb18030Codec, QJisCodec, QHebrewCodec, QSjisCodec and QTsciiCodec.

List of all member functions.

Public Members

  • virtual ~QTextCodec ()
  • virtual const char * name () const = 0
  • virtual const char * mimeName () const
  • virtual int mibEnum () const = 0
  • virtual QTextDecoder * makeDecoder () const
  • virtual QTextEncoder * makeEncoder () const
  • virtual QString toUnicode ( constchar*chars, intlen ) const
  • virtual QCString fromUnicode ( constQString&uc, int&lenInOut ) const
  • QCString fromUnicode ( constQString&uc ) const
  • QString toUnicode ( constQByteArray&a, intlen ) const
  • QString toUnicode ( constQByteArray&a ) const
  • QString toUnicode ( constQCString&a, intlen ) const
  • QString toUnicode ( constQCString&a ) const
  • QString toUnicode ( constchar*chars ) const
  • virtual bool canEncode ( QCharch ) const
  • virtual bool canEncode ( constQString&s ) const
  • virtual int heuristicContentMatch ( constchar*chars, intlen ) const = 0
  • virtual int heuristicNameMatch ( constchar*hint ) const

Static Public Members

  • QTextCodec * loadCharmap ( QIODevice*iod )
  • QTextCodec * loadCharmapFile ( QStringfilename )
  • QTextCodec * codecForMib ( intmib )
  • QTextCodec * codecForName ( constchar*name, intaccuracy = 0 )
  • QTextCodec * codecForContent ( constchar*chars, intlen )
  • QTextCodec * codecForIndex ( inti )
  • QTextCodec * codecForLocale ()
  • void setCodecForLocale ( QTextCodec*c )
  • void deleteAllCodecs ()
  • const char * locale ()

Protected Members

  • QTextCodec ()

Static Protected Members

  • int simpleHeuristicNameMatch ( constchar*name, constchar*hint )

Detailed Description

The QTextCodec class provides conversion between text encodings.

Qt 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.

Qt provides a set of QTextCodec 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:

  • Big5 -- Chinese
  • eucJP -- Japanese
  • eucKR -- Korean
  • GBK -- Chinese
  • JIS7 -- Japanese
  • Shift-JIS -- Japanese
  • TSCII -- Tamil
  • utf8 -- Unicode, 8-bit
  • utf16 -- Unicode
  • KOI8-R -- Russian
  • KOI8-U -- Ukrainian
  • ISO8859-1 -- Western
  • ISO8859-2 -- Central European
  • ISO8859-3 -- Central European
  • ISO8859-4 -- Baltic
  • ISO8859-5 -- Cyrillic
  • ISO8859-6 -- Arabic
  • ISO8859-7 -- Greek
  • ISO8859-8 -- Hebrew, visually ordered
  • ISO8859-8-i -- Hebrew, logically ordered
  • ISO8859-9 -- Turkish
  • ISO8859-10
  • ISO8859-13
  • ISO8859-14
  • ISO8859-15 -- Western
  • CP850
  • CP874
  • CP1250 -- Central European
  • CP1251 -- Cyrillic
  • CP1252 -- Western
  • CP1253 -- Greek
  • CP1254 -- Turkish
  • CP1255 -- Hebrew
  • CP1256 -- Arabic
  • CP1257 -- Baltic
  • CP1258
  • Apple Roman
  • TIS-620 -- Thai

QTextCodecs 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:

  QCString locallyEncoded = "..."; // text to convert
  QTextCodec *codec = QTextCodec::codecForName("KOI8-R"); // get the codec for KOI8-R
  QString 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:

  QString unicodeString = "..."; // any Unicode text
  QTextCodec *codec = QTextCodec::codecForName("KOI8-R"); // get the codec for KOI8-R
  QCString 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 QTextDecoder object for the codec and use this QTextDecoder for the whole decoding process, as shown below:

  QTextCodec *c = QTextCodec::codecForName( "Shift-JIS" );
  QTextDecoder *decoder = c->makeDecoder();

  QString unicodeString;
  while( receiving_data ) {
      QByteArray chunk = new_data;
      unicodeString += decoder->toUnicode( chunk.data(), chunk.length() );
  }
  

The QTextDecoder object maintains state between chunks and therefore works correctly even if a multi-byte character is split between chunks.

Creating your own Codec class

By making objects of subclasses of QTextCodec, support for new text encodings can be added to Qt.

More recently created QTextCodec 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 QTextStream, and under X11, for the locale-specific character input and output.

To add support for another 8-bit encoding to Qt, make a subclass of QTextCodec and implement at least the following methods:

   const char* name() const
   
Return the official name for the encoding.

   int mibEnum() const
   
Return 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:

   QTextDecoder* makeDecoder() const
   
Return a QTextDecoder that remembers incomplete multi-byte sequence prefixes or other required state.

If the encoding does not require state, you should implement:

   QString toUnicode(const char* chars, int len) const
   
Converts len characters from chars to Unicode.

The base QTextCodec 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:

   QTextEncoder* makeEncoder() const
   
Return a QTextDecoder.

   QCString fromUnicode(const QString& uc, int& lenInOut ) const
   
Converts lenInOut characters (of type QChar) from the start of the string uc, returning a QCString 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) const
   
Gives a value indicating how likely it is that len characters from chars are in the encoding.

A good model for this function is the QWindowsLocalCodec::heuristicContentMatch function found in the Qt sources.

A QTextCodec subclass might have improved performance if you also re-implement:

   bool canEncode( QChar ) const
   
Test if a Unicode character can be encoded.

   bool canEncode( const QString& ) const
   
Test if a string of Unicode characters can be encoded.

   int heuristicNameMatch(const char* hint) const
   
Test if a possibly non-standard name is referring to the codec.

Codecs can also be created as plugins.

See also Internationalization with Qt.


Member Function Documentation

QTextCodec::QTextCodec () [protected]

Constructs a QTextCodec, and gives it the highest precedence. The QTextCodec should always be constructed on the heap (i.e. with new()), and once constructed it becomes the responsibility of Qt to delete it (which is done at QApplication destruction).

QTextCodec::~QTextCodec () [virtual]

Destroys the QTextCodec. Note that you should not delete codecs yourself: once created they become Qt's responsibility.

bool QTextCodec::canEncode ( QCharch ) const [virtual]

Returns TRUE if the unicode character ch can be fully encoded with this codec; otherwise returns FALSE. The default implementation tests if the result of toUnicode(fromUnicode(ch)) is the original ch. Subclasses may be able to improve the efficiency.

bool QTextCodec::canEncode ( constQString&s ) const [virtual]

This is an overloaded member function, provided for convenience. It behaves essentially like the above function.

s contains the string being tested for encode-ability.

QTextCodec* QTextCodec::codecForContent ( constchar*chars, intlen ) [static]

Searches all installed QTextCodec objects, returning the one which most recognizes the given content. May return 0.

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.

QTextCodec* QTextCodec::codecForIndex ( inti ) [static]

Returns the QTextCodec i positions from the most recently inserted codec, or 0 if there is no such QTextCodec. Thus, codecForIndex(0) returns the most recently created QTextCodec.

Example: qwerty/qwerty.cpp.

QTextCodec* QTextCodec::codecForLocale () [static]

Returns a pointer to the codec most suitable for this locale.

Example: qwerty/qwerty.cpp.

QTextCodec* QTextCodec::codecForMib ( intmib ) [static]

Returns the QTextCodec which matches the MIBenum mib.

QTextCodec* QTextCodec::codecForName ( constchar*name, intaccuracy = 0 ) [static]

Searches all installed QTextCodec objects and returns the one which best matches name. Returns a null pointer if no codec's heuristicNameMatch() reports a match better than accuracy, or if name is a null string.

See also heuristicNameMatch().

void QTextCodec::deleteAllCodecs () [static]

Deletes all the created codecs.

Warning: Do not call this function.

QApplication calls this just before exiting, to delete any QTextCodec objects that may be lying around. Since various other classes hold pointers to QTextCodec objects, it is not safe to call this function earlier.

If you are using the utility classes (like QString) but not using QApplication, calling this function at the very end of your application can be helpful to chase down memory leaks, as QTextCodec objects will not show up.

QCString QTextCodec::fromUnicode ( constQString&uc, int&lenInOut ) const [virtual]

Subclasses of QTextCodec must reimplement either this function or makeEncoder(). It converts the first lenInOut characters of uc from Unicode to the encoding of the subclass. If lenInOut is negative or too large, the length of uc is used instead.

Converts lenInOut characters (not bytes) from uc, producing a QCString. 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 QHebrewCodec.

QCString QTextCodec::fromUnicode ( constQString&uc ) const

This is an overloaded member function, provided for convenience. It behaves essentially like the above function.

uc is the unicode source string.

int QTextCodec::heuristicContentMatch ( constchar*chars, intlen ) const [pure virtual]

Subclasses of QTextCodec 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().

int QTextCodec::heuristicNameMatch ( constchar*hint ) const [virtual]

Returns a value indicating how likely it is that this decoder is appropriate for decoding some format that has the given name. The name is compared with the hint.

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.

QTextCodec* QTextCodec::loadCharmap ( QIODevice*iod ) [static]

Reads a POSIX2 charmap definition from iod. The parser recognizes the following lines:

<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 QTextCodec 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 QTextCodec subclass, since tables in code are in memory shared by all applications simultaneously using Qt.

See also loadCharmapFile().

Example: qwerty/qwerty.cpp.

QTextCodec* QTextCodec::loadCharmapFile ( QStringfilename ) [static]

A convenience function for loadCharmap() that loads the charmap definition from the file filename.

const char * QTextCodec::locale () [static]

Returns a string representing the current language.

Example: i18n/main.cpp.

QTextDecoder* QTextCodec::makeDecoder () const [virtual]

Creates a QTextDecoder which stores enough state to decode chunks of char* data to create chunks of Unicode data. The default implementation creates a stateless decoder, which is sufficient for only the simplest encodings where each byte corresponds to exactly one Unicode character.

The caller is responsible for deleting the returned object.

QTextEncoder* QTextCodec::makeEncoder () const [virtual]

Creates a QTextEncoder which stores enough state to encode chunks of Unicode data as char* data. The default implementation creates a stateless encoder, which is sufficient for only the simplest encodings where each Unicode character corresponds to exactly one character.

The caller is responsible for deleting the returned object.

int QTextCodec::mibEnum () const [pure virtual]

Subclasses of QTextCodec must reimplement this function. It returns the MIBenum (see the IANA character-sets encoding file for more information). It is important that each QTextCodec subclass returns the correct unique value for this function.

Reimplemented in QEucJpCodec.

const char * QTextCodec::mimeName () const [virtual]

Returns the preferred mime name of the encoding as defined in the IANA character-sets encoding file.

Reimplemented in QEucJpCodec, QEucKrCodec, QGbkCodec, QJisCodec, QHebrewCodec and QSjisCodec.

const char * QTextCodec::name () const [pure virtual]

Subclasses of QTextCodec 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:

  • On X11, heuristicNameMatch( const char * hint ) is used to test if a the QTextCodec can convert between Unicode and the encoding of a font with encoding hint, such as "iso8859-1" for Latin-1 fonts, "koi8-r" for Russian KOI8 fonts. The default algorithm of heuristicNameMatch() uses name().
  • Some applications may use this function to present encodings to the end user.

Example: qwerty/qwerty.cpp.

void QTextCodec::setCodecForLocale ( QTextCodec*c ) [static]

Set the codec to c; this will be returned by codecForLocale(). This might be needed for some applications that want to use their own mechanism for setting the locale.

See also codecForLocale().

int QTextCodec::simpleHeuristicNameMatch ( constchar*name, constchar*hint ) [static protected]

A simple utility function for heuristicNameMatch(): it does some very minor character-skipping so that almost-exact matches score high. name is the text we're matching and hint is used for the comparison.

QString QTextCodec::toUnicode ( constchar*chars, intlen ) const [virtual]

Subclasses of QTextCodec must reimplement this function or makeDecoder(). It converts the first len characters of chars to Unicode.

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.

QString QTextCodec::toUnicode ( constQByteArray&a, intlen ) const

This is an overloaded member function, provided for convenience. It behaves essentially like the above function.

a contains the source characters; len contains the number of characters in a to use.

QString QTextCodec::toUnicode ( constQByteArray&a ) const

This is an overloaded member function, provided for convenience. It behaves essentially like the above function.

a contains the source characters.

QString QTextCodec::toUnicode ( constQCString&a, intlen ) const

This is an overloaded member function, provided for convenience. It behaves essentially like the above function.

a contains the source characters; len contains the number of characters in a to use.

QString QTextCodec::toUnicode ( constQCString&a ) const

This is an overloaded member function, provided for convenience. It behaves essentially like the above function.

a contains the source characters.

QString QTextCodec::toUnicode ( constchar*chars ) const

This is an overloaded member function, provided for convenience. It behaves essentially like the above function.

chars contains the source characters.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文