Команда IT специалистов выполнит подготовку инфраструктуры для вашего бизнеса.
Внедрение самых передовых решений и технологий.
Поддержка и сопровождение ваших сервисов.
Выполнение работ под "ключ", от покупки сервера, до настройки автоматизации процессов.
8(977)608-78-62 adm@nixm.ru

utf-8 в Си

Olej

Re: utf-8 в Си

Сообщение Olej »

Olej писал(а): А дальнейшее развитие текста см. здесь: локализация строк в C-коде.
Текст "Локализация в коде C/C++" сильно дополнен (и архив примеров ещё более).
Редакция 09, от 01.09.2016
Страниц 22
Спасибо этой теме обсуждения :) , что сподвигли меня собрать воедино разрознённые фрагменты и соображения, накопившиеся за годы программной разработки.
Olej

Re: utf-8 в Си

Сообщение Olej »

Тут выяснилась одна интереснейщая подробность...
В Windows, где Unicode = UTF-16, они таки впоролись в проблему:
Юникод и .NET
Ещё несколько лет назад считалось, что все символы «влезут» в диапазон между 0 и 216-1, а это значило, что любой символ можно представить при помощи двух байтов. К сожалению, со временем потребовалось больше символов, что привело к появлению т.н. «суррогатных пар» (surrogate pair). С ними всё стало значительно сложнее
C#, Суррогатные пары Unicode в VisualStudio
Также везде пишут, что суррогатные пары Unicode не поддерживаются только в Windows 95 и 98, а в Windows 2000, XP, Vista, 7, 8
все должно быть в порядке. Однако не работает.
Сурогатные пары - это проблемы выньдаунов, и оставим их решать выньдаунам (пока, временно, или насовсем) :drinks:
Юникод
В UTF-8 не используются суррогатные пары, 4 байтов достаточно для записи любого символа юникода.
P.S. Уточним здесь только, что 4 байта - это код Unicode, UTF-32, или wchar_t (POSIX). А символ в UTF-8 (мультибайтном) может представляться от 1 до 6 байт.

P.P.S. Когда (давно!) я обстоятельно изучал английский, мне запомнилось от университетского преподавателя английская присказка, что-то типа: "I foot my feet..." - что-то типа русского: "Я опять вступил в говно...". Так вот это они точно про Windows ещё тогда придумали! :o
Olej

Re: utf-8 в Си

Сообщение Olej »

Olej писал(а):Тут выяснилась одна интереснейщая подробность...
Следите здесь: локализация в коде C/C++, как писать...
... потому что эти придурки меня сейчас забанят, и только от вас я смогу узнавать что там у них происходит. :lol:
Olej

Re: utf-8 в Си

Сообщение Olej »

Возвращаясь в тему:
nezabudka писал(а):Библитеки wchar и wctype любезно предоставили мне функции
по работе со знаками размером в 4 байта и соответствующие к ним типы переменных wchar_t и wint_t.
Префикс 'w' подразумевает слово 'wide' - расширеный. Кирилица состоит из двух байтовых символов.
Но я не стала ограничивать размер вводимых знаков 2 байтами и выбрала буфер ввода размером
в 4 байта
Кодировка UTF-8, применяющаяся сейчас в Linux повсеместно, предусматривает кодирование любых символов, в самом общем случае (английских, русских, китайских, арабских ... племени бхуту ...) от 1 до 6 байт на символ.

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

Re: utf-8 в Си

Сообщение Olej »

Olej писал(а):Но это настолько обширная + интересная тема, что она заслуживает отдельного рассмотрения, в отдельной теме.
Как обещал - так и сделал :) .
Вот здесь: регулярные выражения.
Olej

Re: utf-8 в Си

Сообщение Olej »

Olej писал(а): Как обещал - так и сделал :) .

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

[olej@dell Соль]$ export LANG=ko_KR.utf8mb4

[olej@dell Соль]$ locale | head -n2
LANG=ko_KR.utf8mb4
LC_CTYPE="ko_KR.utf8mb4"
Язык, локаль - корейский.
Но кодирование UTF-8.

А теперь внимательно следите за руками... :D

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

[olej@dell regex]$ echo "русский текст на корейский манер"
русский текст на корейский манер

[olej@dell regex]$ echo вашшче | egrep "ш{2,}"
вашшче
А вот работа поиска по регулярным выражениям, мои примеры кода, которые не изменяют локаль программы!

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

[olej@dell regex]$ ./regex2 арт
аппарат апартамент аплодисмент
'аппарат апартамент аплодисмент' ->
19/25 : арт
^C

[olej@dell regex]$ ./regex3 "(аш)+"
шабаш
'шабаш' ->
6/10 : аш
6/10 : аш
^C
Так что и с корейским языком всё ОК! :shock:
Ответить

Вернуться в «C/C++»