seocod.ru
http://seocod.ru/forum/

локализация строк в C-коде
http://seocod.ru/forum/viewtopic.php?f=31&t=2237
Страница 3 из 4

Автор:  Olej [ 04 фев 2016, 19:40 ]
Заголовок сообщения:  Re: локализация строк в C-коде

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() не может быть выведена.

Автор:  Olej [ 04 фев 2016, 19:48 ]
Заголовок сообщения:  Re: локализация строк в C-коде

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


Всё ОК: широкострочные символы выводятся из одного кода с обычными.

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

Вложения:
out.tgz [1.28 КБ]
Скачиваний: 156

Автор:  Olej [ 04 фев 2016, 19:50 ]
Заголовок сообщения:  Re: локализация строк в C-коде

Olej писал(а):
А как быть тем C++ писателям, которые любят этим заниматься в C++ на Windows :oops: ... или любой другой C++ системе?

Хорошо бы ещё всё это выше показанное кино ... по крайней мере относительно C++, просмотреть ещё бы и в Windows.

Автор:  Olej [ 05 фев 2016, 02:12 ]
Заголовок сообщения:  Re: локализация строк в C-коде

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 консольные приложения не имеют какого-то существенного интереса.

Вложения:
win.png
win.png [ 159.95 КБ | Просмотров: 2035 ]
vs2.png
vs2.png [ 202.34 КБ | Просмотров: 2035 ]

Автор:  Olej [ 20 авг 2016, 21:57 ]
Заголовок сообщения:  Re: локализация строк в C-коде

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

Вложения:
localiz_05.odt [49.78 КБ]
Скачиваний: 112
localiz_05.tgz [3.99 КБ]
Скачиваний: 114

Автор:  Olej [ 01 сен 2016, 17:53 ]
Заголовок сообщения:  Re: локализация строк в C-коде

Olej писал(а):
Первая (внятная) и очень черновая редакция того, что получается - прилагается. ;-)

Цитата:
Редакция 09, от 01.09.2016
Страниц 22


Вложения:
localiz_09.odt [60.9 КБ]
Скачиваний: 111
Localiz_09.tgz [7.9 КБ]
Скачиваний: 111

Автор:  Olej [ 02 сен 2016, 00:17 ]
Заголовок сообщения:  Re: локализация строк в C-коде

Глава, посвящённая локализации в тексте стандарта 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.

Автор:  Olej [ 06 сен 2016, 11:22 ]
Заголовок сообщения:  Re: локализация строк в C-коде

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) не приходится решать такие проблемы.

Автор:  Olej [ 06 сен 2016, 11:42 ]
Заголовок сообщения:  Re: локализация строк в C-коде

Olej писал(а):
Olej писал(а):
Там повылезали очень интересные подробности

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

Автор:  Olej [ 06 сен 2016, 11:48 ]
Заголовок сообщения:  Re: локализация строк в C-коде

Olej писал(а):
заслуживает отдельного рассмотрения, в отдельной теме.

Вот такая тема: регулярные выражения в C/C++.
Всё, что касается регулярных выражений я буду потихоньку сливать туда.

Страница 3 из 4 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/