Spec-Zone.ru › Qt 6.0

Класс 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()

Общие типы

ConversionFlags
ConverterState

Общедоступные функции

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

Статические общедоступные члены

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 и обратно. Вы также можете создавать свои собственные классы кодеков.

Поддерживаемые кодировки:

  • Big5
  • Big5-HKSCS
  • CP949
  • EUC-JP
  • EUC-KR
  • GB18030
  • HP-ROMAN8
  • IBM 850
  • IBM 866
  • IBM 874
  • ISO 2022-JP
  • ISO 8859-1 to 10
  • ISO 8859-13 to 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 character-sets, имя должно быть предпочтительным MIME-именем для кодировки.
aliases() Возвращает список альтернативных имён кодировки. QTextCodec предоставляет реализацию по умолчанию, возвращающую пустой список. Например, у "ISO-8859-1" есть алиасы "latin1", "CP819", "IBM819" и "iso-ir-100".
mibEnum() Возвращает MIB-перечисление для кодировки, если оно указано в файле кодировок IANA character-sets.
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 character-sets.

[static] QList<QByteArray> QTextCodec::availableCodecs()

Возвращает список всех доступных кодеков по имени. Используйте QTextCodec::codecForName(), чтобы получить QTextCodec по имени.

Список может содержать много упоминаний одного и того же кодека, если у кодека есть алиасы.

Примечание: Эта функция безопасна для многопоточности.

См. также availableMibs(), name() и aliases().

[static] QList<int> QTextCodec::availableMibs()

Возвращает список MIB для всех доступных кодеков. Используйте QTextCodec::codecForMib(), чтобы получить QTextCodec для MIB.

Примечание: Эта функция безопасна для многопоточности.

См. также 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. Если кодировка не может быть определена, эта перегрузка возвращает латинский 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

Если кодировка не может быть определена из предоставленных данных, эта перегрузка возвращает латинский 1 QTextCodec.

См. также codecForHtml().

[pure virtual protected] QByteArray QTextCodec::convertFromUnicode(const QChar *input, int number, QTextCodec::ConverterState *state) const

Подклассы QTextCodec должны переопределять эту функцию.

Преобразует первые number символов из массива input из Unicode в кодировку подкласса и возвращает результат в QByteArray.

состояние может быть nullptr, в этом случае преобразование является бессостоятельным, и должны использоваться правила преобразования по умолчанию. Если состояние не равно 0, кодек должен сохранить состояние после преобразования в состояние и скорректировать члены remainingChars и invalidChars структуры.

[pure virtual protected] QString QTextCodec::convertToUnicode(const char *chars, int len, QTextCodec::ConverterState *state) const

Подклассы QTextCodec должны переопределить эту функцию.

Преобразует первые len символов chars из кодировки подкласса в Юникод и возвращает результат в QString.

состояние может быть nullptr, в этом случае преобразование является бессостоятельным и используются правила преобразования по умолчанию. Если состояние не равно 0, кодек должен сохранить состояние после преобразования в состояние и скорректировать члены 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 для получения дополнительной информации). Важно, чтобы каждый подкласс QTextCodec возвращал корректное уникальное значение для этой функции.

[pure virtual] QByteArray QTextCodec::name() const

Подклассы QTextCodec должны переопределить эту функцию. Она возвращает имя поддерживаемой кодировки подклассом.

Если кодек зарегистрирован как набор символов в файле спецификаций кодировок IANA, этот метод должен возвращать предпочитаемое имя 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.0/qtextcodec.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API