Класс QTextCodec
Класс QTextCodec предоставляет преобразования между кодировками текста. Подробнее...
| Заголовок: | #include <QTextCodec> |
| qmake: | QT += core |
Примечание: Все функции в этом классе являются перевходными.
- setCodecForLocale(QTextCodec *c)
- ~QTextCodec()
Примечание: Эти функции также являются безопасными для потоков:
- codecForName(const QByteArray &name)
- codecForMib(int mib)
- availableCodecs()
- availableMibs()
- codecForLocale()
Типы публичного доступа
| ConverterState | |
| Перечисление | ConversionFlag { DefaultConversion, ConvertInvalidToNull, IgnoreHeader } |
| Флаги | ConversionFlags |
Функции публичного доступа
| 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 to 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); Для чтения или записи файлов в различных кодировках используйте QTextStream и его функцию setCodec(). См. пример Кодеки для примера использования QTextCodec для ввода-вывода файлов.
Следует проявлять осторожность при попытке преобразовать данные частями, например, при получении данных через сеть. В таких случаях возможно, что многобайтовый символ будет разделен на две части. В лучшем случае это может привести к потере символа, а в худшем — к сбою всего преобразования.
В таких ситуациях необходимо создать объект 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 и реализуйте функции, перечисленные в таблице ниже.
END_OF_DOCUMENT_MARKER| Функция | Описание |
|---|---|
| name() | Возвращает официальное имя кодировки. Если кодировка указана в файле кодировок IANA, имя должно быть предпочтительным MIME-именем для кодировки. |
| aliases() | Возвращает список альтернативных имён кодировки. QTextCodec предоставляет реализацию по умолчанию, которая возвращает пустой список. Например, "ISO-8859-1" имеет «latin1», «CP819», «IBM819» и «iso-ir-100» в качестве псевдонимов. |
| mibEnum() | Возвращает MIB-перечисление для кодировки, если оно указано в файле кодировок IANA. |
| convertToUnicode() | Преобразует строку 8-битных символов в Unicode. |
| convertFromUnicode() | Преобразует строку Unicode в строку 8-битных символов. |
См. также QTextStream, QTextDecoder, QTextEncoder и Пример кодировок текста.
Документация типов членов
enum QTextCodec::ConversionFlagflags QTextCodec::ConversionFlags
| Константа | Значение | Описание |
|---|---|---|
QTextCodec::DefaultConversion |
0 |
Флаги не установлены. |
QTextCodec::ConvertInvalidToNull |
0x80000000 |
Если этот флаг установлен, каждый недопустимый входной символ выводится как нулевой символ. |
QTextCodec::IgnoreHeader |
0x1 |
Игнорировать метку порядка байтов Unicode и не генерировать её. |
Тип ConversionFlags является псевдонимом для QFlags<ConversionFlag>. Он хранит логическое ИЛИ комбинацию значений ConversionFlag.
Документация функций-членов
[protected] QTextCodec::QTextCodec()
Конструирует QTextCodec и присваивает ему наивысший приоритет. QTextCodec всегда следует создавать в куче (т. е. с помощью new). Qt принимает владение и удалит его при завершении приложения.
[virtual protected] QTextCodec::~QTextCodec()
Уничтожает QTextCodec. Обратите внимание, что вы не должны удалять кодеки самостоятельно: после создания они становятся ответственностью Qt.
Предупреждение: Эта функция не реентерабельна.
[virtual] QList<QByteArray> QTextCodec::aliases() const
Подклассы могут возвращать ряд псевдонимов для соответствующего кодека.
Стандартные псевдонимы для кодеков можно найти в файле кодировок IANA.
[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 содержит строку, проверяемую на возможность кодирования.
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 (метку порядка байтов) и заголовок метаданных типа контента, и возвращает экземпляр QTextCodec, способный декодировать HTML в Unicode. Если кодек не может быть определен из предоставленного контента, возвращается defaultCodec.
Эта функция была введена в Qt 4.4.
См. также codecForUtfText().
[static] QTextCodec *QTextCodec::codecForHtml(const QByteArray &ba)
Это перегруженная функция.
Пытается определить кодировку предоставленного фрагмента HTML в заданном массиве байтов ba, проверив BOM (метку порядка байтов) и заголовок метаданных типа контента, и возвращает экземпляр 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.
Эта функция была введена в Qt 4.6.
См. также 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().
END_OF_DOCUMENT_MARKER
[pure virtual protected] QByteArray QTextCodec::convertFromUnicode(const QChar *input, int number, QTextCodec::ConverterState *state) const
Подклассы QTextCodec должны переопределять эту функцию.
Преобразует первые number символов из массива input из Юникода в кодировку подкласса и возвращает результат в 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.
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 * данных, чтобы создать куски данных Юникода.
Вызывающий объект отвечает за удаление возвращённого объекта.
Эта функция была введена в Qt 4.7.
QTextEncoder *QTextCodec::makeEncoder(QTextCodec::ConversionFlags flags = DefaultConversion) const
Создаёт QTextEncoder со специфицированными flags для кодирования кусков данных Юникода в виде char * данных.
Вызывающий объект отвечает за удаление возвращённого объекта.
Эта функция была введена в Qt 4.7.
[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-5.14/qtextcodec.html