переносимость Lin<=>Win консольных приложений

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: переносимость Lin<=>Win консольных приложений

Непрочитанное сообщение Olej » 23 мар 2013, 17:29

Olej писал(а):Программа, которая позволяет хоть как-то разобраться в этом идиотизме + просмотреть как в Windows записываются имена (символьные) локалей (которые у них пишутся совершенно не как у людей):
Та же программа, с минимальными изменениями, которая одинаково компилируется и в Linux (GCC) и в Windows (Visual Studio 10), и позволяющая переустанавливать локали там и там, и смотреть их символьные имена:

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

bash-4.2$ ./ruscons1
russian string: Выводится русский текст
default locale: ru_RU.UTF-8
old cout.locale: C
new locale: POSIX
cout.locale : C
locale : C
russian string: Выводится русский текст
new locale: ru_RU.1251
wrong locale
new locale: C
cout.locale : C
locale : C
russian string: Выводится русский текст
new locale: ru_RU.UTF-8
cout.locale : ru_RU.UTF-8
locale : ru_RU.UTF-8
russian string: Выводится русский текст
new locale: ru_RU.8859-5
cout.locale : ru_RU.8859-5
locale : ru_RU.8859-5
russian string: Выводится русский текст
new locale: ^C
Вложения
locale.tgz
(22.78 КБ) 415 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: переносимость Lin<=>Win консольных приложений

Непрочитанное сообщение Olej » 23 мар 2013, 17:48

Olej писал(а):и смотреть их символьные имена:
Имена известных Linux локализаций смотрим, например, так:

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

bash-4.2$ locale -a | grep ru
ru_RU
ru_RU.iso88595
ru_RU.koi8r
ru_RU.utf8
russian
ru_UA
ru_UA.koi8u
ru_UA.utf8
Это были отобраны только русские локализации, ... потому как вообще локализаций в системе весьма много:

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

bash-4.2$ locale -a | wc -l
777

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: переносимость Lin<=>Win консольных приложений

Непрочитанное сообщение Olej » 24 мар 2013, 18:17

Olej писал(а):
cema писал(а):Может не в тему, просто увидел знакомые буквы...
Я когда-то решил как-то так http://goodluck.uzelok.net/archives/55
а 2-й ... посмотрю что там позже. ;-)
Посмотрел ... попозже ;-)

Я тоже когда-то делал так ... читая незабвенную книгу Джефри Рихтера по Win32.
Но это всё построено на преобразованиях вызовами OemToChar(), CharToOem() ... Это вызовы Win32 API, это будет замечательно работать в Windows, но это не будет даже компилироваться при переносе в любую другую операционную систему. :-(

cema
Писатель
Сообщения: 246
Зарегистрирован: 14 июн 2012, 06:01
Контактная информация:

Re: переносимость Lin<=>Win консольных приложений

Непрочитанное сообщение cema » 24 мар 2013, 20:06

Olej писал(а):
Olej писал(а):
cema писал(а):Может не в тему, просто увидел знакомые буквы...
Я когда-то решил как-то так http://goodluck.uzelok.net/archives/55
а 2-й ... посмотрю что там позже. ;-)
Посмотрел ... попозже ;-)

Я тоже когда-то делал так ... читая незабвенную книгу Джефри Рихтера по Win32.
Он самый, а после я уже ничем подобным не занимался.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: переносимость Lin<=>Win консольных приложений

Непрочитанное сообщение Olej » 09 апр 2013, 18:42

Olej писал(а): или, если это С, а не С++ :

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

setlocale( LC_ALL, "Russian_Russia.1251" )
Это плохо, потому, что это сработает в Windows, но не будет работать при переносе в UNIX.
Windows вообще готовит замечательные чудеса! ;-) :
- консоль Windows (printf(...)) - исключительно CP-866
- есть давно и всем известная консольная программа FAR ... которая работает в консоли и всякий вывод осуществляет в CP-866 ...
- но её собственный редактор по F4 - открывает на редактирование файл в кодировке Win-1251 :-o (по крайней мере в своих дефаултных настройках)
- т.е. вы или не можете редактировать файл программы .c, или то, что вы наредактируете (визуально) при выполнении этого кода будет полным маразмом.

Это уже болезнь! :-o

Вот такая программка (loc3.c):

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

#include <stdlib.h>
int main( int argc, char *argv[] ) {
   printf( "бва®Є  ў CP-866\n" ); // CP-866 
   printf( "строка в Windows-1251\n" ); // Win-1251
   printf( "строка в UTF-8\n" ); // UTF-8 
   return 0;
}
3 строки идентичные, в разных 3-кодировках - это показано и набрано в редакторе AkelPad (от наших соотечественников)...

А вот как та же программа видится в окне редактирования Visual Studio:

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

#include <stdlib.h>
int main( int argc, char *argv[] ) {
   printf( "бва®Є  ў CP-866\n" ); // CP-866 
   printf( "строка в Windows-1251\n" ); // Win-1251
   printf( "строка в UTF-8\n" ); // UTF-8 
   return 0;
}
Вот то, как это выглядит в редакторе (F4) FAR:
loc3.JPG
loc3.JPG (32.63 КБ) 6231 просмотр
И, наконец, выполнение программы:

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

C:\MinGW\msys\1.0\home\olej\loc3>loc3
строка в CP-866
ёЄЁюър т Windows-1251
╤Б╤В╤А╨╛╨║╨░ ╨▓ UTF-8

Аватара пользователя
Lepton
Писатель
Сообщения: 73
Зарегистрирован: 18 окт 2011, 20:26
Контактная информация:

Re: переносимость Lin<=>Win консольных приложений

Непрочитанное сообщение Lepton » 07 май 2013, 22:10

Olej писал(а):
Olej писал(а): - а у нормальных людей (в UNIX, в описаниях С++ у Б.Страуструпа, POSIX / IEEE Std 1003.1-2001) эти локали именуются по типу: "en_US.UTF-8", "de_DE.UTF-8", "ru_RU. ISO-8859-5"

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

bash-4.2$ set | grep LANG
LANG=ru_RU.UTF-8
Кстати, интересно, вот что происходит, если в Linux изменить дефаултные установки языка, которые потянут и изменение locale:

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

bash-4.2$ export LANG=ru_RU.1251

bash-4.2$ set | grep LANG
LANG=ru_RU.1251

bash-4.2$ locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=ru_RU.1251
LC_CTYPE="ru_RU.1251"
LC_NUMERIC="ru_RU.1251"
LC_TIME="ru_RU.1251"
LC_COLLATE="ru_RU.1251"
LC_MONETARY="ru_RU.1251"
LC_MESSAGES="ru_RU.1251"
LC_PAPER="ru_RU.1251"
LC_NAME="ru_RU.1251"
LC_ADDRESS="ru_RU.1251"
LC_TELEPHONE="ru_RU.1251"
LC_MEASUREMENT="ru_RU.1251"
LC_IDENTIFICATION="ru_RU.1251"
LC_ALL=

bash-4.2$ ./randwr
terminate called after throwing an instance of 'std::runtime_error'
  what():  locale::facet::_S_create_c_locale name not valid
Аварийный останов (core dumped)


Добовлял локаль так:

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

sudo localedef -f CP1251 -i ru_RU /usr/lib/locale/ru_RU.cp1251
Вывод:

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

~$ locale -a | grep ru 
ru_RU.cp1251
ru_RU.utf8
ru_UA.utf8
экпорт переменной;

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

~$ export LANG=ru_RU.cp1251
~$ locale
LANG=ru_RU.cp1251
LANGUAGE=ru_RU:en_US:en
LC_CTYPE="ru_RU.cp1251"
LC_NUMERIC=ru_RU.UTF-8
LC_TIME=ru_RU.UTF-8
LC_COLLATE="ru_RU.cp1251"
LC_MONETARY=ru_RU.UTF-8
LC_MESSAGES="ru_RU.cp1251"
LC_PAPER=ru_RU.UTF-8
LC_NAME=ru_RU.UTF-8
LC_ADDRESS=ru_RU.UTF-8
LC_TELEPHONE=ru_RU.UTF-8
LC_MEASUREMENT=ru_RU.UTF-8
LC_IDENTIFICATION=ru_RU.UTF-8
LC_ALL=
может я не о том? :oops:

xaker1
Активист
Сообщения: 10
Зарегистрирован: 28 июн 2013, 11:45
Контактная информация:

Re: переносимость Lin<=>Win консольных приложений

Непрочитанное сообщение xaker1 » 28 июн 2013, 21:44

Кстати, в Win кодировка ввода текста (cin>>a;) и вывода (cout<<a;) отличаются, что влечет за собой вполне логичные проблемы.
Собственно столкнулся с этим на первом курсе, и не стал особо разбираться. Но нормально вывести введенные пользователем русские буковки весьма геморойно.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: переносимость Lin<=>Win консольных приложений

Непрочитанное сообщение Olej » 28 июн 2013, 22:00

xaker1 писал(а):Собственно столкнулся с этим на первом курсе, и не стал особо разбираться. Но нормально вывести введенные пользователем русские буковки весьма геморойно.
Ну так надо же когда-то разобраться? ;-)

Ответить

Вернуться в «Программирование»

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

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