Разбираясь плотно с примерами кода относительно локализации, а ещё больше с регулярные выражения в C/C++, задаюсь несколькими вопросами (их много, и я их выделяю знаком ):Olej писал(а):К счастью, в Linux (UTF-8) не приходится решать такие проблемы.
- таблицы Unicode предполагают взаимно-однозначное отображение 4-х байтного кода (UTF-32) в символ, 4 байта содержат и номер кодовой страницы (язык) и смещение кода символа в странице...
- кодирование UTF-8 предусматривает взаимно-однозначное кодирование от 1-го до 6-ти байт (мультибайтная последовательность) каждого 4-х байтного кода Unicode (символа).
- зачем тогда в коде C/C++, который хочет работать с широкими символами (wchar_t, wstring), выводом (вводом) в (из) поток wcout / wcin, или взаимными преобразованиями мультибайтных (UTF-8) и широких (UTF-32) символов (mb*() и т.п.), нужно обязательно установить локаль вызовами типа :
Код: Выделить всё
setlocale( LC_CTYPE, "ru_RU.utf8" ); // язык C
Код: Выделить всё
std::locale( "ru_RU.utf8" ); // язык C++
Код: Выделить всё
void test14( void ) {
printf( "locale: %s\n", setlocale( LC_ALL, NULL ) );
setlocale( LC_CTYPE, "en_US.utf8" );
printf( "%ls : %s\n", L"русская строка в локали", setlocale( LC_CTYPE, NULL ) );
}
Код: Выделить всё
$ a.out
locale: C
русская строка в локали : en_US.utf8
- зачем тогда вообще установка локали
- и почему она не нужна библиотекам сопоставления с регулярными выражениями