Rating@Mail.ru

Форум по операционной системе GNU/Linux и свободному программному обеспечению


Текущее время: 17 дек 2017, 03:29

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Re: локализация строк в C-коде
Непрочитанное сообщениеДобавлено: 04 фев 2016, 19:40 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10265
Откуда: Харьков
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 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10265
Откуда: Харьков
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
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: локализация строк в C-коде
Непрочитанное сообщениеДобавлено: 04 фев 2016, 19:50 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10265
Откуда: Харьков
Olej писал(а):
А как быть тем C++ писателям, которые любят этим заниматься в C++ на Windows :oops: ... или любой другой C++ системе?

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


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: локализация строк в C-коде
Непрочитанное сообщениеДобавлено: 05 фев 2016, 02:12 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10265
Откуда: Харьков
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 КБ | Просмотров: 2036 ]
vs2.png
vs2.png [ 202.34 КБ | Просмотров: 2036 ]
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: локализация строк в C-коде
Непрочитанное сообщениеДобавлено: 20 авг 2016, 21:57 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10265
Откуда: Харьков
Языковая локализация в C и C++ - непростая и путанная тема ... главным образом потому, что по ней очень мало описано. Поэтому я взялся записать итоги того, что здесь обсуждается в виде связного текста + программных кодов примеров.
Первая (внятная) и очень черновая редакция того, что получается - прилагается. ;-)


Вложения:
localiz_05.odt [49.78 КБ]
Скачиваний: 112
localiz_05.tgz [3.99 КБ]
Скачиваний: 114
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: локализация строк в C-коде
Непрочитанное сообщениеДобавлено: 01 сен 2016, 17:53 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10265
Откуда: Харьков
Olej писал(а):
Первая (внятная) и очень черновая редакция того, что получается - прилагается. ;-)

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


Вложения:
localiz_09.odt [60.9 КБ]
Скачиваний: 111
Localiz_09.tgz [7.9 КБ]
Скачиваний: 111
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: локализация строк в C-коде
Непрочитанное сообщениеДобавлено: 02 сен 2016, 00:17 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10265
Откуда: Харьков
Глава, посвящённая локализации в тексте стандарта 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 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10265
Откуда: Харьков
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 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10265
Откуда: Харьков
Olej писал(а):
Olej писал(а):
Там повылезали очень интересные подробности

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


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: локализация строк в C-коде
Непрочитанное сообщениеДобавлено: 06 сен 2016, 11:48 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10265
Откуда: Харьков
Olej писал(а):
заслуживает отдельного рассмотрения, в отдельной теме.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB
[ Time : 0.673s | 23 Queries | GZIP : On ]