Так, с одной половиной вопроса я разобрался...
nonstop писал(а): ↑11.09.2007 09:20
1. Стандартный C++ не умеет работать с UTF-8
Смотря что понимается под "работой". Если хранение литералов ютф-8, их ввод-вывод, и работа со строками string в ютф8 - то умеет замечательно, но с оговорками, которые надо знать (все те фу-и которые работают собственно с текстом и буквами есессно не работают, итераторы по строкам тоже).
2. Есть специальные библиотеки для этой цели (
glibmm,
ICU)
Да, IBM ICU. На неск десятков мегабайт весом. Но для чтения-вывода строк и набора литералов в программе они не нужны.
3. manual к gettext очень подробный, так все описано как делать
Да, и с ютф-8 оно прекрасно-не прекрасно, то по крайней мере как-то - работает. Уже проверял.
4. если использовать gettext, следует придерживаться установленных правил оформления переводимых строк.
Судя по записи L"msg", это пришло из-под Visual Studio, так вот следует писать
Нет. L"abcdef\u1234\U00001234fghty" пришло из стандарта языка, как и L'a', а никак не из МСВС. Это широкие символьные и строковые литералы, а фунции gettext служат для загрузки обычных.
5. po-файлы поддерживают массу кодировок, просто ее нужно указать в заголовке po-файла
Код: Выделить всё
"Content-Type: text/plain; charset=UTF-8\n"
PO-файлы - да, и ладно. Меня интересует загрузка L-литералов. Они загружаются не в UTF-8, а (для i386/amd64 GNU/Linux) в UTF-32LE. Значит или MO файл должен создаваться для такого, или, скорее, в PO файле часть строк должны помечаться как широкие. И должны быть функции для работы с ними.
v04bvs
Стандартными средствами С++ с юникодом работать неудобно, это факт. Советую взять Qt, там всё попроще будет.
Только что ковырялся в TagLib, которая-де косит под куте-стиль, и даже живет в сети где-то на кутешных сайтах, - там доморощенный класс String реализован как обертка вокруг std::wstring.
Qt ладно, мне пока охота разобраться с этим как-нибудь, без лишних мегатонн библиотек.
А так - обычно компилятор трактует исходный текст в кодировке локали. Хотя я лично считаю, что любой программный текст ОБЯЗАН быть в 7-битной кодировке ASCII, а все национальные строки должны подгружаться из внешних ресурсов.
Трактует, так и есть. Все оказалось смешнее, щас расскажу.
Короче, вот это
Код: Выделить всё
#include <iostream>
int main() {
setlocale(LC_ALL, "");
std::wcout << L"Всем привет!" << std::endl;
std::wstring wstr;
std::wcin >> wstr;
std::wcout << L'[' << wstr << L']' << std::endl;
return 0;
}
работает как предполагается. Локаль надо включать, иначе конвертор в wstream-ах работает в "C", все ломая. Это я так догадываюсь.
Остается вопрос с каталогами-месиджами и чем-нибудь gettext-подобным...
UPD
(задумчиво) В принципе, я конечно могу забить строки в каталог UTF-8, и для gettext попробовать сочинить обертку, чтоб конвертила их в UTF32 при загрузке... Как-то это все немного извратно. ;-/