13.1. Жесткое кодирование строк в коде Unicode

13.1. Жесткое кодирование строк в коде Unicode

Проблема

Требуется в исходном файле жестко закодировать строки в коде Unicode, т.е. используя расширенный набор символов.

Решение

Начинайте строку с префикса L и затем вводите символы в своем редакторе исходных текстов, как вы это обычно делаете при написании строк, или используйте шестнадцатеричные значения, представляющие нужный вам символ в коде Unicode. Пример 13.1 демонстрирует оба способа кодирования таких строк.

Пример 13.1. Жесткое кодирование строк в коде Unicode

#include <iostream>

#include <fstream>

#include <string>

using namespace std;

int main() {

 // Создать несколько строк с символами кода Unicode

 wstring ws1 = L"Infinity: u221E";

 wstring ws2 = L"Euro: €"

 wchar_t w[] = L"Infinity: u221E";

 wofstream out("tmp\unicode.txt");

 out << ws2 << endl;

 wcout << ws2 << endl;

}

Обсуждение

Основной вопрос, возникающий при жестком кодировании строк в коде Unicode, связан с выбором способа ввода строки в редакторе исходных текстов. В C++ предусмотрен тип расширенного набора символов wchar_t, который может хранить строки в коде Unicode. Точное представление wchar_t зависит от реализации, однако часто используется формат UTF-32. Класс wstring определяется в <string> как последовательность символов типа wchar_t, подобно тому как класс string представляет собой последовательность символов типа char. (Строго говоря, тип wstring определяется, конечно, с помощью typedef как basic_string<wchar_t>.)

Самый простой способ ввода символов в коде Unicode — это использование префикса L перед строковым литералом, как показано в примере 13.1.

wstring ws1 = L"Infinity, u2210"; // Использовать сам код

wstring ws2 = L"Euro: €"; // или просто ввести символ

Теперь можно записать эти строки с расширенным набором символов в поток с расширенным набором символов.

wcout << ws1 << endl; // wcout - версия cout для расширенного набора символов

Их можно записывать также в файлы:

wofstream out("tmp\unicode.txt");

out << ws2 << endl;

При работе с различными кодировками наибольшую ловкость приходится проявлять не для ввода правильных символов в ваши исходные файлы, а при определении типа символьных данных, получаемых из базы данных, по запросу HTTP, из пользовательского ввода и т.д., что выходит за рамки стандарта C++. Стандарт C++ не устанавливает никаких специальных требований, кроме того, что операционная система может использовать для исходных файлов любую кодировку, если она поддерживает, по крайней мере, 96 символов, используемых в языке С++. Для символов, не попадающих в этот набор, называемый основным исходным набором символов, стандартом предусматривается возможность их получения с помощью escape-последовательностей uXXXX или UXXXXXXXX, где X — шестнадцатеричная цифра.