Rating@Mail.ru

Форум сайта "Виртуальная энциклопедия "Linux по-русски"


Текущее время: 25 апр 2017, 19:35

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




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

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 9192
Откуда: Харьков
Опять у меня мельком выплыла тема локализации русскоязычных строк в программах на C.
Тема освещена в литературе крайне плохо ... потому, что народ изучает C по переводным учебникам, а тем вполне хватает ASCIIZ и типа данных char*.

Но для работы с русскоязычными строками временами не хватает представления char[].
И тогда возникает иногда необходимость применять:

1. "широкие" символы wchar_t, которые являются (в POSIX) прямым изображением UNICODE кодировки UTF-32, и, естественно, каждый символ занимает 4 байта;

2. многобайтные представления, которые хоть и загружены в char[], но в кодировке UTF-8 (т.е. тоже UNICODE, но в другой кодировке); они непригодны для непосредственной обработки строковыми функциями + функции преобразований (mbtowc(), wctomb(), mblen(), mbrtowc(), wcrtomb(), mbrlen() и т.д.), для преобразования в wchat_t[] и обратно (См.: Многобайтовые символы, mbchar(3C))

Но часто можно работать в программе С со строками char[] и не прибегая к локализованным формам.
Вот я и решил для себя освежить в памяти (последний раз писал что-то связанное с этим году в 2008-м):
- когда достаточно char[], а когда и потребуются локализованные представления;
- как работать с локализованными строками простейшим образом.


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

Зарегистрирован: 28 дек 2012, 14:05
Сообщения: 113
Откуда: Самара
Цитата:
Но часто можно работать в программе С со строками char[] и не прибегая к локализованным формам.
Вот я и решил для себя освежить в памяти (последний раз писал что-то связанное с этим году в 2008-м):
- когда достаточно char[], а когда и потребуются локализованные представления;
- как работать с локализованными строками простейшим образом.


Со своей женской наивностью смею предположить, что локализованные строки нужны при взаимодействии потоков разных родительских процессов. Или более формально - при передаче информации между разными уровнями эталонной модели взаимодействия открытых систем.


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

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 9192
Откуда: Харьков
Виктория писал(а):
Цитата:
Но часто можно работать в программе С со строками char[] и не прибегая к локализованным формам.
Вот я и решил для себя освежить в памяти (последний раз писал что-то связанное с этим году в 2008-м):
- когда достаточно char[], а когда и потребуются локализованные представления;
- как работать с локализованными строками простейшим образом.


Со своей женской наивностью смею предположить, что локализованные строки нужны при взаимодействии потоков разных родительских процессов. Или более формально - при передаче информации между разными уровнями эталонной модели взаимодействия открытых систем.


Может быть и это ... нужно будет посмотреть в ту сторону.

Но локализованные строки нужны в любых операциях контекстного поиска, использования регулярных выражений и т.п. Что гораздо шире.

Мультибайтное представление строк (UTF-8) - это внешнее представление, т.к. строки приходят и уходят в процессе обмена с а). терминалом, б). GUI окошками, ... и даже в). текстовой консолью. Если для их содержимого не предполагаются какие-то трансформации, поиск, выделения и т.п. - они так и могут оставаться в памяти в формате UTF-8 (мультибайтовые char[]), и позже с успехом также использоваться для вывода.

Но если нам нужны операции с содержимым строки, то она должна быть преобразована в wchar_t[] (UTF-32), а потом над ней выполнять операции функциями вида wcs*() аналогичными str*(), например, вместо strchr() - wcschr() и т.д. А перед выводом (например в файл) полученные строки wchar_t[] обратно нужно преобразовать в char[]. Исключение здесь состоит в функции printf, которая может "проглотить" малоизвестный формат "%ls" - который и предполагает wchar_t-строки. А также, предполагаю, и fprintf(), которая сделает такое же преобразование при выводе в файловый поток.


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

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 9192
Откуда: Харьков
Olej писал(а):
Но если нам нужны операции с содержимым строки, то она должна быть преобразована в wchar_t[]

Вот некоторые, пока начальные, фокусы в этом направлении (программа в архиве):
Код:
bash-4.2$ ./locstr -vv
размер wchar_t = 4, размер wint_t = 4
локализация: ru_RU.utf8
строка (или @файл): ^C

Код:
bash-4.2$ ./locstr -v
локализация: ru_RU.utf8
строка (или @файл): строка
преобразовано: 12 байт в 6 символов
printf: строка
строка (или @файл): ещё 1-на строка
преобразовано: 26 байт в 15 символов
printf: ещё 1-на строка
строка (или @файл): new srting
преобразовано: 10 байт в 10 символов
printf: new srting
строка (или @файл): ^C

Ну и, для памятки, то, какие локализации присутствуют в Linux (например), и подсказка как их правильно записывать:
Код:
bash-4.2$ locale -a
...
ru_RU
ru_RU.iso88595
ru_RU.koi8r
ru_RU.utf8
russian
ru_UA
ru_UA.koi8u
ru_UA.utf8
...
uk_UA
uk_UA.koi8u
uk_UA.utf8
...
uz_UZ
uz_UZ@cyrillic
uz_UZ.iso88591
uz_UZ.utf8@cyrillic
...

Код:
bash-4.2$ locale -a | wc -l
777


Вложения:
locale.tgz [4.14 КБ]
Скачиваний: 471
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: локализация строк в C-коде
Непрочитанное сообщениеДобавлено: 23 мар 2013, 17:43 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 9192
Откуда: Харьков
Всё, что связано с локализациями, продолжается сильно обсуждаться вот здесь (чтоб не переписывать одно и то же): переносимость Lin<=>Win консольных приложений.


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

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 9192
Откуда: Харьков
Виктория писал(а):
Цитата:
Но часто можно работать в программе С со строками char[] и не прибегая к локализованным формам.
Вот я и решил для себя освежить в памяти (последний раз писал что-то связанное с этим году в 2008-м):
- когда достаточно char[], а когда и потребуются локализованные представления;
- как работать с локализованными строками простейшим образом.


Со своей женской наивностью смею предположить, что локализованные строки нужны при взаимодействии потоков разных родительских процессов. Или более формально - при передаче информации между разными уровнями эталонной модели взаимодействия открытых систем.


Мельком возвращаясь к этому вопросу (локализация строк) ... навеяно это разборками с языком Python и с тем, насколько там лучше всё это сделано.

Локализация строк "вылазит" как только вы начинаете перемещать программы или данные межу различными системами:
- операционными: Linux - Windows - Solaris - MINIX и т.д.
- аппаратными: x86 - ARM - MIPS - PPC и т.д.
- сетевыми хостами: big-endian - litle-endian, ... да и HTML-контекст в разных кодировках ...

До тех пор, пока вы "замкнуты" в окружении одной системы - вам локализация не грозит. До тех пор, пока "вся страна сидела в винде" :lol: (года до 88-89) никто и не заикался о локализациях.
P.S. Правда был казус на заре MS-DOS, когда разные локализаторы понаделали различных таблиц ASCII (2-х половин, 128-255), а под них понаделали соответствующих клавиатурных руссификаторов ... но это только потому, что все "спешили впереди паровоза". Откуда и CP-1251, и KOI-8r, и всякая другая дрянь...

По поводу ваших замечаний...

Виктория писал(а):
локализованные строки нужны при взаимодействии потоков разных родительских процессов.

Здесь мне непонятно почему... или я не понял что имеется в виду.

Виктория писал(а):
Или более формально - при передаче информации между разными уровнями эталонной модели взаимодействия открытых систем.

А здесь, в принципе, "да". Это и есть тот случай, что я назвал "сетевыми хостами".
Решать эту задачу назначен был "представительский" уровень 7-ми уровневой модели ANSI.
Вот только с самой 7-ми уровневой моделью взаимодействия открытых систем случился казус ;-) :
- доминирующими с IT-индустрии стали протоколы TCP/IP (со всеми своими прибамбасами, и описанный в 200 и более книгах RFC)...
- а TCP/IP - более раннее творение, чем 7-ми уровневая модель...
- и TCP/IP не вписывается в 7-ми уровневую модель со своим собственным делением уровней: L1, L2, L3


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

Зарегистрирован: 28 дек 2012, 14:05
Сообщения: 113
Откуда: Самара
Olej писал(а):
Мельком возвращаясь к этому вопросу (локализация строк) ... навеяно это разборками с языком Python и с тем, насколько там лучше всё это сделано.

Локализация строк "вылазит" как только вы начинаете перемещать программы или данные межу различными системами:
- операционными: Linux - Windows - Solaris - MINIX и т.д.
- аппаратными: x86 - ARM - MIPS - PPC и т.д.
- сетевыми хостами: big-endian - litle-endian, ... да и HTML-контекст в разных кодировках ...

До тех пор, пока вы "замкнуты" в окружении одной системы - вам локализация не грозит. До тех пор, пока "вся страна сидела в винде" :lol: (года до 88-89) никто и не заикался о локализациях.


Виктория писал(а):
Или более формально - при передаче информации между разными уровнями эталонной модели взаимодействия открытых систем.

А здесь, в принципе, "да". Это и есть тот случай, что я назвал "сетевыми хостами".
Решать эту задачу назначен был "представительский" уровень 7-ми уровневой модели ANSI.
Вот только с самой 7-ми уровневой моделью взаимодействия открытых систем случился казус ;-) :
- доминирующими с IT-индустрии стали протоколы TCP/IP (со всеми своими прибамбасами, и описанный в 200 и более книгах RFC)...
- а TCP/IP - более раннее творение, чем 7-ми уровневая модель...
- и TCP/IP не вписывается в 7-ми уровневую модель со своим собственным делением уровней: L1, L2, L3


Виктория писал(а):
локализованные строки нужны при взаимодействии потоков разных родительских процессов.

Если быть честной, то я не помню, что я хотела кратко зафиксировать. Я думаю, что всем следует проигнорировать это замечание.

"Представительский" уровень в TCP/IP тоже присутствует?


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

Зарегистрирован: 28 дек 2012, 14:05
Сообщения: 113
Откуда: Самара
Olej, можно ещё один вопрос:
Когда я сохраняю Ваши файлы на свой компьютер с Windows, например с примерами по Python, не могут возникнуть проблем с локализацией (Вы, вот, для копирования примеров между Linux и Windows используете FTP)?


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

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 9192
Откуда: Харьков
Виктория писал(а):
Когда я сохраняю Ваши файлы на свой компьютер с Windows, например с примерами по Python, не могут возникнуть проблем с локализацией (Вы, вот, для копирования примеров между Linux и Windows используете FTP)?


У меня не наблюдается нарушений с локализацией, поэтому я не могу проверить ... но я видел ваши цитаты с нарушенной локализацией.
Давайте проверять и искать причину где-то в конкретной теме (по Python) на конкретных примерах.
Проблемы могут быть, предполагаю, связанные с различными версиями Windows или локализациями этих инсталляций Windows.

Копирую я файлы в Windows по FTP, ... но я выкладывал архивы, *.tgz - вы именно архивы брали для проверки?
Архив или разархивируется, или нет, если он скачан с ошибками (побит).

Или вы копировали тексты программ с экрана копи-паст? Тогда нарушения, конечно, будут - на этапе именно паст ;-)


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

Зарегистрирован: 28 дек 2012, 14:05
Сообщения: 113
Откуда: Самара
В качестве примеров я брала файлы с расширением py :-)


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

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


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

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


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

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