Страница 3 из 4

Re: локализация строк в C-коде

Добавлено: 04 фев 2016, 19:40
Olej
Olej писал(а):3. но самый важный результат: printf() будет работать и с типовыми и с широкими символами вперемешку любым образом.
Но не нужно чрезмерного оптимизма!
Это работает только потому, что мы вручную (в строке формата) указываем для printf() как преобразовывать элемент вывода.

Переходим к потокам ввода-вывода (FILE*):

Код: Выделить всё

int main() {
   setlocale( LC_ALL, "" );
   int res;
   char cs[] = "строка1\n";
   wchar_t ws[] = L"строка2\n";
   res = fputws( ws, stdout );
   printf( "%d: %m\n", res );
   res = fputs( cs, stdout );
   printf( "%d: %m\n", res );
   res = fputws( ws, stdout );
   printf( "%d: %m\n", res );
   res = fputs( cs, stdout );
   printf( "%d: %m\n", res );
   return 0;
}

Код: Выделить всё

olej@nvidia ~/2016_WORK/in.WORK/out $ ./out6a
строка2
строка2

Код: Выделить всё

int main() {
   setlocale( LC_ALL, "" );
   int res;
   char cs[] = "строка1\n";
   wchar_t ws[] = L"строка2\n";
   res = fputs( cs, stdout );
   printf( "%d: %m\n", res );
   res = fputws( ws, stdout );
   printf( "%d: %m\n", res );
   res = fputs( cs, stdout );
   printf( "%d: %m\n", res );
   res = fputws( ws, stdout );
   printf( "%d: %m\n", res );
   return 0;
}

Код: Выделить всё

olej@nvidia ~/2016_WORK/in.WORK/out $ ./out6b
строка1
1: Выполнено
-1: Выполнено
строка1
1: Выполнено
-1: Выполнено
И в том и другом случае поток вывода разрушается. Да так (1-й случай), что и pruntf() отшибает мозги, и он не может вывести даже вывести числовой код ошибки.

P.S. С ptintf(), в общем то, ясно:
- printf() - это библиотечный вызов, не системный, он описан в секции 3 man
- он последовательно вызывает библиотечный sprintf() и затем системный write( 1, ... )
- после sprintf() и формата %ls в строке нет уже никаких wchar_t, только мултибайтные UTF-8, поэтому проблем не возникает
- но если поток вывода разрушен (для char) ранее вызовом fputws(), то уже и строка char[ ], подготовленная sprintf() не может быть выведена.

Re: локализация строк в C-коде

Добавлено: 04 фев 2016, 19:48
Olej
Olej писал(а):
Olej писал(а):3. но самый важный результат: printf() будет работать и с типовыми и с широкими символами вперемешку любым образом.
Переходим к потокам ввода-вывода (FILE*):

Код: Выделить всё

int main() {
   setlocale( LC_ALL, "" );
   int res;
   char cs[] = "строка1\n";
   wchar_t ws[] = L"строка2\n";
   res = fputws( ws, stdout );
   stdout = freopen( NULL, "w", stdout );
   printf( "%d\n", res );
   stdout = freopen( NULL, "w", stdout );
   res = fputs( cs, stdout );
   stdout = freopen( NULL, "w", stdout );
   printf( "%d\n", res );
   stdout = freopen( NULL, "w", stdout );
   res = fputws( ws, stdout );
   stdout = freopen( NULL, "w", stdout );
   printf( "%d\n", res );
   stdout = freopen( NULL, "w", stdout );
   res = fputs( cs, stdout );
   stdout = freopen( NULL, "w", stdout );
   printf( "%d\n", res );
   return 0;
}

Код: Выделить всё

olej@nvidia ~/2016_WORK/in.WORK/out $ make
gcc -Wall     out7.c   -o out7
olej@nvidia ~/2016_WORK/in.WORK/out $ ./out7
строка2
1
строка1
1
строка2
1
строка1
1
Всё ОК: широкострочные символы выводятся из одного кода с обычными.

Ну и здесь же - все показанные выше примеры кода в одном архивчике.

Re: локализация строк в C-коде

Добавлено: 04 фев 2016, 19:50
Olej
Olej писал(а): А как быть тем C++ писателям, которые любят этим заниматься в C++ на Windows :oops: ... или любой другой C++ системе?
Хорошо бы ещё всё это выше показанное кино ... по крайней мере относительно C++, просмотреть ещё бы и в Windows.

Re: локализация строк в C-коде

Добавлено: 05 фев 2016, 02:12
Olej
Olej писал(а):
Olej писал(а): А как быть тем C++ писателям, которые любят этим заниматься в C++ на Windows :oops: ... или любой другой C++ системе?
Хорошо бы ещё всё это выше показанное кино ... по крайней мере относительно C++, просмотреть ещё бы и в Windows.
1-я картинка - это Code::Blocks 13.12 (последний, 2013 года) здесь компилятор MinGw
2-я картинка - это Visual Studio 2010
Всё это в виртуальном Windows 7 под гипервизором VirtualBox.

Это выше моего понимания!
Поэтому я не берусь это комментировать.

Единственное смягчение этого "разнообрразия" :-o в том, что для Windows консольные приложения не имеют какого-то существенного интереса.

Re: локализация строк в C-коде

Добавлено: 20 авг 2016, 21:57
Olej
Языковая локализация в C и C++ - непростая и путанная тема ... главным образом потому, что по ней очень мало описано. Поэтому я взялся записать итоги того, что здесь обсуждается в виде связного текста + программных кодов примеров.
Первая (внятная) и очень черновая редакция того, что получается - прилагается. ;-)

Re: локализация строк в C-коде

Добавлено: 01 сен 2016, 17:53
Olej
Olej писал(а):Первая (внятная) и очень черновая редакция того, что получается - прилагается. ;-)
Редакция 09, от 01.09.2016
Страниц 22

Re: локализация строк в C-коде

Добавлено: 02 сен 2016, 00:17
Olej
Глава, посвящённая локализации в тексте стандарта POSIX
The Open Group Base Specifications Issue 7
IEEE Std 1003.1, 2013 Edition
Copyright © 2001-2013 The IEEE and The Open Group

7. Locale
Applications can select the desired locale by calling the newlocale() or setlocale() function with the appropriate value. If the function is invoked with an empty string, such as:
newlocale(LC_ALL_MASK, "", (locale_t)0);
or:
setlocale(LC_ALL, "");
И ещё здесь:
8. Environment Variables
...
8.2 Internationalization Variables
This section describes environment variables that are relevant to the operation of internationalized interfaces described in POSIX.1-2008.

Re: локализация строк в C-коде

Добавлено: 06 сен 2016, 11:22
Olej
Olej писал(а):
Редакция 09, от 01.09.2016
Страниц 22
Дальше этот текст/коды будет постепенно подправляться и расширяться, все самые новые редакции можно найти здесь (обновляемый версии). На сегодня это:
Редакция 11, от 06.09.2016
Страниц 23
Там повылезали очень интересные подробности относительно Unicode в Windows ... которые вызвали просто истерику и виндаунов при обсуждении вот этого моего текста: локализация в коде C/C++, как писать. Подробности связаны с UTF-16 представлением Unicode в Windows, и тем, что, естественно теперь им 16-бит не хватает:
- появляются "суррогатные пары", когда символ теперь будет представляться 2-мя 16-бит кодами...
- из за порядка байт байт (little endian и big endian) все снова поделились на "остроголовых" и "тупоголовых", появились кодировки UTF-16LE и UTF-16BE, символ маркер типа кодировки (... всё опять "так непросто" :-o )
- символы протяжённые и непротяжённые + представление символов комбинацией базового + модификатора:
Изображение

К счастью, в Linux (UTF-8) не приходится решать такие проблемы.

Re: локализация строк в C-коде

Добавлено: 06 сен 2016, 11:42
Olej
Olej писал(а):
Olej писал(а): Там повылезали очень интересные подробности
Но есть ещё интереснейший вопрос, получающийся на пересечении терминов: Unicode, UTF-8, локализация, C и C++ - это регулярные выражения:
- как работать с регулярными выражениями в C++ и, особенно, C?
- какие там предоставляются возможности?
- как там в регулярных выражениях обстоят дела с локализованными (русскими) строками?
Но это настолько обширная + интересная тема, что она заслуживает отдельного рассмотрения, в отдельной теме.

Re: локализация строк в C-коде

Добавлено: 06 сен 2016, 11:48
Olej
Olej писал(а):заслуживает отдельного рассмотрения, в отдельной теме.
Вот такая тема: регулярные выражения в C/C++.
Всё, что касается регулярных выражений я буду потихоньку сливать туда.