Класс QTextCodec
Класс QTextCodec предоставляет преобразования между кодировками текста. Подробнее...
| Заголовок: | #include <QTextCodec> |
| CMake: | find_package(Qt6 COMPONENTS Core5Compat REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core5Compat) |
| qmake: | QT += core5compat |
Примечание: Все функции в этом классе являются взаимопомещаемыми (реентерабельными).
- setCodecForLocale(QTextCodec *c)
- ~QTextCodec()
Примечание: Эти функции также являются безопасными для потоков:
- codecForName(const QByteArray &name)
- codecForMib(int mib)
- availableCodecs()
- availableMibs()
- codecForLocale()
Типы public
| ConversionFlags | |
| ConverterState |
Функции public
| virtual QList<QByteArray> | aliases() const |
| bool | canEncode(QChar ch) const |
| bool | canEncode(const QString &s) const |
| bool | canEncode(QStringView s) const |
| QByteArray | fromUnicode(const QString &str) const |
| QByteArray | fromUnicode(QStringView str) const |
| QByteArray | fromUnicode(const QChar *input, int number, QTextCodec::ConverterState *state = nullptr) const |
| QTextDecoder * | makeDecoder(QTextCodec::ConversionFlags flags = DefaultConversion) const |
| QTextEncoder * | makeEncoder(QTextCodec::ConversionFlags flags = DefaultConversion) const |
| virtual int | mibEnum() const = 0 |
| virtual QByteArray | name() const = 0 |
| QString | toUnicode(const QByteArray &a) const |
| QString | toUnicode(const char *chars) const |
| QString | toUnicode(const char *input, int size, QTextCodec::ConverterState *state = nullptr) const |
Статические public члены
| QList<QByteArray> | availableCodecs() |
| QList<int> | availableMibs() |
| QTextCodec * | codecForHtml(const QByteArray &ba, QTextCodec *defaultCodec) |
| QTextCodec * | codecForHtml(const QByteArray &ba) |
| QTextCodec * | codecForLocale() |
| QTextCodec * | codecForMib(int mib) |
| QTextCodec * | codecForName(const QByteArray &name) |
| QTextCodec * | codecForName(const char *name) |
| QTextCodec * | codecForUtfText(const QByteArray &ba, QTextCodec *defaultCodec) |
| QTextCodec * | codecForUtfText(const QByteArray &ba) |
| void | setCodecForLocale(QTextCodec *c) |
Защищенные функции
| QTextCodec() | |
| virtual | ~QTextCodec() |
| virtual QByteArray | convertFromUnicode(const QChar *input, int number, QTextCodec::ConverterState *state) const = 0 |
| virtual QString | convertToUnicode(const char *chars, int len, QTextCodec::ConverterState *state) const = 0 |
Подробное описание
Qt использует Unicode для хранения, отображения и работы со строками. Во многих ситуациях вам может потребоваться работать с данными, использующими другую кодировку. Например, большинство японских документов по-прежнему хранятся в кодировках Shift-JIS или ISO 2022-JP, в то время как российские пользователи часто имеют свои документы в KOI8-R или Windows-1251.
Qt предоставляет набор классов QTextCodec для помощи в преобразовании форматов, отличных от Unicode, в Unicode и из Unicode. Вы также можете создавать свои собственные классы кодировок.
Поддерживаемые кодировки:
- Big5
- Big5-HKSCS
- CP949
- EUC-JP
- EUC-KR
- GB18030
- HP-ROMAN8
- IBM 850
- IBM 866
- IBM 874
- ISO 2022-JP
- ISO 8859-1 до 10
- ISO 8859-13 до 16
- Iscii-Bng, Dev, Gjr, Knd, Mlm, Ori, Pnj, Tlg и Tml
- KOI8-R
- KOI8-U
- Macintosh
- Shift-JIS
- TIS-620
- TSCII
- UTF-8
- UTF-16
- UTF-16BE
- UTF-16LE
- UTF-32
- UTF-32BE
- UTF-32LE
- Windows-1250 до 1258
Если Qt скомпилирован с включенной поддержкой ICU, большинство кодировок, поддерживаемых ICU, также будут доступны для приложения.
QTextCodec можно использовать следующим образом для преобразования некоторой строки, закодированной в локальной кодировке, в Unicode. Предположим, у вас есть некоторая строка, закодированная в кодировке KOI8-R, и вы хотите преобразовать её в Unicode. Простой способ сделать это:
QByteArray encodedString = "...";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QString string = codec->toUnicode(encodedString); После этого, string содержит текст, преобразованный в Unicode. Преобразование строки из Unicode в локальную кодировку также очень просто:
QString string = "...";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QByteArray encodedString = codec->fromUnicode(string); Необходимо быть внимательным, когда пытаетесь преобразовать данные частями, например, при получении их по сети. В таких случаях возможно, что многобайтовый символ будет разделен на две части. В лучшем случае это может привести к потере символа, а в худшем случае — к сбою всего преобразования.
В таких ситуациях необходимо создать объект QTextDecoder для кодировки и использовать этот QTextDecoder для всего процесса декодирования, как показано ниже:
QTextCodec *codec = QTextCodec::codecForName("Shift-JIS");
QTextDecoder *decoder = codec->makeDecoder();
QString string;
while (new_data_available()) {
QByteArray chunk = get_new_data();
string += decoder->toUnicode(chunk);
}
delete decoder; Объект QTextDecoder сохраняет состояние между частями и, следовательно, работает правильно, даже если многобайтовый символ разделен между частями.
Создание собственного класса кодировки
Поддержка новых кодировок текста может быть добавлена в Qt путем создания подклассов QTextCodec.
Чистые виртуальные функции описывают кодировщик системе, а кодировщик используется по мере необходимости в различных форматах текстовых файлов, поддерживаемых QTextStream, и в X11 для ввода и вывода символов, специфичных для локали.
Для добавления поддержки другой кодировки в Qt создайте подкласс QTextCodec и реализуйте функции, перечисленные в таблице ниже.
| Функция | Описание |
|---|---|
| name() | Возвращает официальное имя кодировки. Если кодировка указана в файле кодировок набора символов IANA IANA character-sets encoding file, имя должно соответствовать предпочтительному MIME-имени кодировки. |
| aliases() | Возвращает список альтернативных имен кодировки. QTextCodec предоставляет реализацию по умолчанию, которая возвращает пустой список. Например, у "ISO-8859-1" есть псевдонимы "latin1", "CP819", "IBM819" и "iso-ir-100". |
| mibEnum() | Возвращает значение MIB enum для кодировки, если она указана в файле кодировок набора символов IANA IANA character-sets encoding file. |
| convertToUnicode() | Преобразует строку символов 8-битной кодировки в Unicode. |
| convertFromUnicode() | Преобразует строку Unicode в строку символов 8-битной кодировки. |
См. также QTextStream, QTextDecoder и QTextEncoder.
Документация типов членов
[alias] QTextCodec::ConversionFlags
| Константа | Описание |
|---|---|
DefaultConversion |
Флаг не установлен. |
ConvertInvalidToNull |
Если этот флаг установлен, каждый недопустимый символ ввода выводится как нулевой символ. |
IgnoreHeader |
Игнорировать метку порядка байтов Unicode и не генерировать её. |
[alias] QTextCodec::ConverterState
Документация функций-членов
[protected] QTextCodec::QTextCodec()
Создаёт QTextCodec с наивысшим приоритетом. QTextCodec всегда должен создаваться в куче (т. е. с new). Qt получает владение и удалит его при завершении приложения.
[virtual protected] QTextCodec::~QTextCodec()
Уничтожает QTextCodec. Обратите внимание, что вы не должны удалять кодеки самостоятельно: после создания они становятся ответственностью Qt.
Предупреждение: Эта функция не реентерабельна.
[virtual] QList<QByteArray> QTextCodec::aliases() const
Подклассы могут возвращать список псевдонимов для кодека.
Стандартные псевдонимы кодеков можно найти в файле кодировок набора символов IANA IANA character-sets encoding file.
[static] QList<QByteArray> QTextCodec::availableCodecs()
Возвращает список всех доступных кодеков по имени. Для получения QTextCodec по имени используйте QTextCodec::codecForName().
Список может содержать несколько упоминаний одного и того же кодека, если у кодека есть псевдонимы.
Примечание: Эта функция безопасна для потоков.
См. также availableMibs(), name() и aliases().
[static] QList<int> QTextCodec::availableMibs()
Возвращает список MIB для всех доступных кодеков. Для получения QTextCodec по MIB используйте QTextCodec::codecForMib().
Примечание: Эта функция безопасна для потоков.
См. также availableCodecs() и mibEnum().
bool QTextCodec::canEncode(QChar ch) const
Возвращает true если символ Unicode ch может быть полностью закодирован данным кодеком; в противном случае возвращает false.
bool QTextCodec::canEncode(const QString &s) const
Это перегруженная функция.
s содержит строку, проверяемую на возможность кодирования.
[since 5.10] bool QTextCodec::canEncode(QStringView s) const
Это перегруженная функция.
Возвращает true если строка Unicode s может быть полностью закодирована этим кодеком; в противном случае возвращает false.
Эта функция была введена в Qt 5.10.
[static] QTextCodec *QTextCodec::codecForHtml(const QByteArray &ba, QTextCodec *defaultCodec)
Пытается определить кодировку предоставленного фрагмента HTML в данном массиве байтов ba, проверяя BOM (метку порядка байтов) и заголовок метатега content-type, и возвращает экземпляр QTextCodec, способный декодировать HTML в Unicode. Если кодек не может быть определён из предоставленного содержимого, возвращается defaultCodec.
См. также codecForUtfText().
[static] QTextCodec *QTextCodec::codecForHtml(const QByteArray &ba)
Это перегруженная функция.
Пытается определить кодировку предоставленного фрагмента HTML в данном массиве байтов ba, проверяя BOM (метку порядка байтов) и заголовок метатега content-type, и возвращает экземпляр QTextCodec, способный декодировать HTML в Unicode. Если кодек не может быть определён, этот перегруз возвращает кодек Latin-1 QTextCodec.
[static] QTextCodec *QTextCodec::codecForLocale()
Возвращает указатель на кодек, наиболее подходящий для данной локали.
Кодек будет получен из ICU, если используется этот бэкенд, иначе он может быть получен из API, специфичного для операционной системы. В последнем случае имя кодека может быть "System".
Примечание: Эта функция безопасна для потоков.
См. также setCodecForLocale().
[static] QTextCodec *QTextCodec::codecForMib(int mib)
Возвращает QTextCodec, соответствующий MIBenum mib.
Примечание: Эта функция безопасна для потоков.
[static] QTextCodec *QTextCodec::codecForName(const QByteArray &name)
Ищет все установленные объекты QTextCodec и возвращает тот, который лучше всего соответствует name; соответствие не учитывает регистр. Возвращает 0, если не найдено ни одного кодека, соответствующего имени name.
Примечание: Эта функция безопасна для потоков.
[static] QTextCodec *QTextCodec::codecForName(const char *name)
Ищет все установленные объекты QTextCodec и возвращает тот, который лучше всего соответствует name; соответствие не учитывает регистр. Возвращает 0, если не найдено ни одного кодека, соответствующего имени name.
[static] QTextCodec *QTextCodec::codecForUtfText(const QByteArray &ba, QTextCodec *defaultCodec)
Пытается определить кодировку предоставленного фрагмента ba, используя BOM (метку порядка байтов), и возвращает экземпляр QTextCodec, способный декодировать текст в Unicode. Эта функция может определить один из следующих кодеков:
- UTF-32 Little Endian
- UTF-32 Big Endian
- UTF-16 Little Endian
- UTF-16 Big Endian
- UTF-8
Если кодек не может быть определён из предоставленного содержимого, возвращается defaultCodec.
См. также codecForHtml().
[static] QTextCodec *QTextCodec::codecForUtfText(const QByteArray &ba)
Это перегруженная функция.
Пытается определить кодировку предоставленного фрагмента ba, используя BOM (метку порядка байтов), и возвращает экземпляр QTextCodec, способный декодировать текст в Unicode. Эта функция может определить один из следующих кодеков:
- UTF-32 Little Endian
- UTF-32 Big Endian
- UTF-16 Little Endian
- UTF-16 Big Endian
- UTF-8
Если кодек не может быть определён из предоставленного содержимого, этот перегруз возвращает кодек Latin-1 QTextCodec.
См. также codecForHtml().
[pure virtual protected] QByteArray QTextCodec::convertFromUnicode(const QChar *input, int number, QTextCodec::ConverterState *state) const
Подклассы QTextCodec должны переопределить эту функцию.
Преобразует первые number символов из массива input из Unicode в кодировку подкласса и возвращает результат в QByteArray.
state может быть nullptr, в этом случае преобразование является бессостоятельным и должны использоваться правила преобразования по умолчанию. Если state не равен 0, кодек должен сохранить состояние после преобразования в state и скорректировать члены структуры remainingChars и invalidChars.
[pure virtual protected] QString QTextCodec::convertToUnicode(const char *chars, int len, QTextCodec::ConverterState *state) const
QTextCodec подклассы должны переопределить эту функцию.
Преобразует первые len символов из chars из кодировки подкласса в Юникод и возвращает результат в QString.
state может быть nullptr, в этом случае преобразование является бессостоятельным и должны использоваться правила преобразования по умолчанию. Если state не равен 0, кодек должен сохранить состояние после преобразования в state и скорректировать члены структуры remainingChars и invalidChars.
QByteArray QTextCodec::fromUnicode(const QString &str) const
Преобразует str из Юникода в кодировку этого кодека и возвращает результат в QByteArray.
[since 5.10] QByteArray QTextCodec::fromUnicode(QStringView str) const
Это перегруженная функция.
Преобразует str из Юникода в кодировку этого кодека и возвращает результат в QByteArray.
Эта функция была добавлена в Qt 5.10.
QByteArray QTextCodec::fromUnicode(const QChar *input, int number, QTextCodec::ConverterState *state = nullptr) const
Преобразует первые number символов из массива input из Юникода в кодировку этого кодека и возвращает результат в QByteArray.
Состояние используемого преобразователя обновляется.
QTextDecoder *QTextCodec::makeDecoder(QTextCodec::ConversionFlags flags = DefaultConversion) const
Создаёт QTextDecoder с указанными flags для декодирования фрагментов char * данных для создания фрагментов данных в Юникоде.
Вызывающая сторона отвечает за удаление возвращённого объекта.
QTextEncoder *QTextCodec::makeEncoder(QTextCodec::ConversionFlags flags = DefaultConversion) const
Создаёт QTextEncoder с указанными flags для кодирования фрагментов данных в Юникоде в char * данные.
Вызывающая сторона отвечает за удаление возвращённого объекта.
[pure virtual] int QTextCodec::mibEnum() const
Подклассы QTextCodec должны переопределить эту функцию. Она возвращает MIBenum (см. файл кодировок IANA character-sets для получения дополнительной информации). Важно, чтобы каждый подкласс QTextCodec возвращал правильное уникальное значение для этой функции.
[pure virtual] QByteArray QTextCodec::name() const
QTextCodec подклассы должны переопределить эту функцию. Она возвращает имя поддерживаемой подклассом кодировки.
Если кодек зарегистрирован как набор символов в файле кодировок IANA character-sets, этот метод должен вернуть предпочтительное имя MIME для кодека, если оно определено, в противном случае — его имя.
[static] void QTextCodec::setCodecForLocale(QTextCodec *c)
Устанавливает кодек в c; он будет возвращён методом codecForLocale(). Если c равен nullptr, кодек сбрасывается до значения по умолчанию.
Это может потребоваться некоторым приложениям, которые хотят использовать собственный механизм для установки локали.
Предупреждение: эта функция не реентерабельна.
См. также codecForLocale().
QString QTextCodec::toUnicode(const QByteArray &a) const
Преобразует a из кодировки этого кодека в Юникод и возвращает результат в QString.
QString QTextCodec::toUnicode(const char *chars) const
Это перегруженная функция.
chars содержит исходные символы.
QString QTextCodec::toUnicode(const char *input, int size, QTextCodec::ConverterState *state = nullptr) const
Преобразует первые size символов из input из кодировки этого кодека в Юникод и возвращает результат в QString.
Состояние используемого преобразователя обновляется.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qtextcodec.html