Выбрать главу

str[0] = 'A';

str[0] = QChar(0x41);

Если исходный файл имеет кодировку Latin-1, задавать символы Latin-1 очень легко:

str[0] = 'C';

Но если исходный файл имеет другую кодировку, хорошо срабатывает вариант с числовым кодом:

str[0] = QChar(0xD1);

Мы можем задать любой символ Unicode с помощью его числового кода. Например, ниже показано, как задается прописная буква «сигма» греческого алфавита («Σ») и символ валюты евро («€»):

str[0] = QChar(0x3A3);

str[0] = QChar(0x20AC);

Все числовые коды, поддерживаемые кодировкой Unicode, можно найти в сети Интернет по адресу http://www.unicode.org/standard/. Если вам приходится редко использовать символы Unicode, не относящиеся к Latin-1, для поиска их кодов вполне достаточно воспользоваться указанным адресом; но Qt обеспечивает более удобный способ ввода в программе Qt строк символов в кодировке Unicode, как мы увидим позднее в данном разделе.

Текстовый процессор в Qt 4 поддерживает на всех платформах следующие системы записи: арабскую, китайскую, кириллическую, греческую, иврит, японскую, корейскую, лаосскую, латинскую, тайскую и вьетнамскую. Он также поддерживает все скрипты 4.1 в кодировке Unicode, которые не требуют специальной обработки. Кроме того, в системе X11 с Fontconfig и в последних версиях системы Windows поддерживаются следующие языки: бенгальский, деванагари, гуйарати, гурмухи, каннада, кхмерский, малайский, сирийский, тамильский, телугу, тхаана (дивехи) и тибетский. Наконец, ория поддерживается в системе X11, а монгольский и синхала поддерживаются в Windows XP. Если в системе установлен соответствующий шрифт, Qt сможет воспроизвести текст на любом из этих языков. А при установке соответствующих программ ввода текста пользователи смогут вводить в своих приложениях Qt текст на этих языках.

Программирование с использованием QChar немного отличается от программирования с применением char. Для получения числового кода символа QChar вызовите для него функцию unicode(). Для получения кода ASCII переменной типа QChar (в виде char) вызовите функцию toLatin1(). Для символов, отсутствующих в кодировке Latin-1, функция toLatin1() возвращает '\0'.

Если нам заранее известно, что все строковые данные в программе представлены в кодировке ASCII или Latin-1, мы можем использовать такие стандартные функции (определенные в файле <cctype>), как isalpha(), isdigit() и isspace(), для обработки возвращаемого функцией toLatin1() значения. Однако в общем случае лучше использовать функции—члены класса QChar для выполнения этих операций, поскольку они будут правильно работать для любых символов Unicode. К таким функциям класса QChar относятся isPrint(), isPunct(), isSpace(), isMark(), isLetter(), isNumber(), isLetterOrNumber(), isDigit(), isSymbol(), isLower() и isUpper(). Например, ниже показано, как осуществлять проверку символа на цифру или прописную букву:

if (ch.isDigit() || ch.isUpper())

Этот фрагмент кода правильно работает для любых алфавитов, в которых различаются символы верхнего и нижнего регистров, в том числе для латинского, греческого и кириллицы.

Строку в кодировке Unicode мы можем использовать в любом месте программного интерфейса Qt, где допускается применение строки типа QString. Qt сам отвечает за правильное ее отображение и преобразование в соответствущие кодировки при взаимодействии с операционной системой.

Особенно внимательными надо быть при чтении и записи текстовых файлов. Текстовые файлы могут использовать различные кодировки, и часто оказывается невозможным определить кодировку текстового файла по его содержанию. По умолчанию QTextStream использует локальную системную 8-битовую кодировку (которая доступна при помощи функции QTextCodec::codecForLocale()), как для чтения, так и для записи. Для стран Америки и Западной Европы это обычно подразумевает кодировку Latin-1.