Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 26.10.2015
Сообщений: 9

Unicode и выбор внутренней кодировки программы

27.10.2015, 02:19. Показов 920. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для Unucode, если в программе посимвольная работа с текстом, то какое лучше выбрать решение в плане кодировки и работы с ней?

На пример, потребуется прыгнуть на 25-й символ. И подобные вещи.

Как известно любой юникодовый элемент полностью влазит в 4 байта. И можно было бы просто взять кодировку UTF-32, но как-то жаба давит. Для экономии придумали не выдавать под символы лишних байт, если в них у символа стоят одни нули. Таким образом в UTF-8 размер элемента может сокращаться с 4 до 3, 2 и 1 байт. Такой текст становится экономней хранить, а если ещё однобайтную часть отдать полностью под ASCII, то для ещё удобнее. Но тогда для программиста становится не возможно работать с таким текстом как с обычным массивом, ибо элементы в тексте непредсказуемо разных размеров. Когда только ввели UTF-16 и отсчитывать стали по 2 байта, то временно стало можно с любым текстом работать как с обычным массивом, так как все возможные элементы умещались в этих двух байтах. Но потом в стандарт добавили новые языки и всё снова стало уныло. С этого момента по-простому только UTF-32.

Стоит ли выбрать UTF-32 для простой полной поддержки или лучше обрезанную двухбайтовую UTF-16 без всякой египетской письменности и домино? Или может быть всё таки стоит заморочиться на полной поддержке UTF-16 с хренением доп массива начальных байтов каждого элемента?

Каков вообще выбор мастеров в этой сфере программирования?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.10.2015, 02:19
Ответы с готовыми решениями:

Настройка unicode. Ошибка при выполнении программы
Здравствуйте. Знаю, что есть tchar.h, но мне нужно настроить unicode самому. #ifdef UNICODE #define TCHAR wchar_t #define...

Преобразование кодировки Unicode в UTF-8
Столкнулся просто с дичайшей проблемой: private void button1_Click(object sender, EventArgs e) { StreamReader...

Чтение файла кодировки Unicode
Здравствуйте, пишу под MFC приложение. Нужно прочитать из текстового файла строки, в кодировке UNICODE. Мои действия: 1) в свойствах...

14
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
27.10.2015, 02:35
Цитата Сообщение от vipermagi Посмотреть сообщение
заморочиться ... с хренением
Цели у вас какие?

Локализация на мандарине?
Или у вас супернапоминалка для русскоязычного пользователя?
Если так, то и однобайтного Windows-1251 достаточно.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
27.10.2015, 02:47
Цитата Сообщение от gazlan Посмотреть сообщение
Если так, то и однобайтного Windows-1251 достаточно.
Ага, сначала один такой "зачем мне юникод? Сделаю Windows-1251". Потом другой "зачем мне юникод? Сделаю shift-JIS". А пользователю потом переключай язык системы туда-сюда, чтоб весь этот зоопарк нормально работал.
0
0 / 0 / 0
Регистрация: 26.10.2015
Сообщений: 9
27.10.2015, 03:00  [ТС]
Цитата Сообщение от gazlan Посмотреть сообщение
Цели у вас какие?
Цель текущего момента - это работа с текстами, которые были набраны обычным способом на клавиатуре на любом ныне используемом языке. В конкретно этом случае не нужны китайские иероглифы, но если расширить задачи и они вдруг станут нужны, тогда нужно будет и думать заново.

Изначально пишу под линуксом, но нужен будет кроссплатформ, и скорее всего кроссфреймворк.
0
 Аватар для iRomul
163 / 104 / 14
Регистрация: 17.10.2012
Сообщений: 488
27.10.2015, 03:08
Можете обратить внимание на либу ICU [home] [wiki].
Она же используется в фреймворке Qt.
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
27.10.2015, 03:42
Цитата Сообщение от vipermagi Посмотреть сообщение
но если расширить задачи и они вдруг станут нужны
Если ... и когда ...

IMHO, для начала стоит убедиться, что это нужно хотя бы вам. По ходу работы цели и приоритеты могут меняться. Начинать надо с минимального прототипа, расширяемого по необходимости, а не с проектирования кроссплатформенного монстра на 123 несуществующих языках.

Можете почитать блог Alconost, чтобы получить представление о локализации.

Не по теме:

Из собственного опыта в нескольких проектах (японский, немецкий, иврит), могу сказать, что добавление еще одного шрифта или RTL не самая большая трудность при локализации.

0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.10.2015, 07:01
ОС-то какая?
Цитата Сообщение от gazlan Посмотреть сообщение
Если так, то и однобайтного Windows-1251 достаточно
Ну gazlan, как всегда, склоняет людей к древним кодировкам. Если Windows, то никаких 1251, использовать WCHAR, как там и положено. А в Linux, wchar_t 4-байтный, проблем с индексацией нет.
0
0 / 0 / 0
Регистрация: 26.10.2015
Сообщений: 9
27.10.2015, 09:07  [ТС]
Цитата Сообщение от gazlan Посмотреть сообщение
IMHO, для начала стоит убедиться, что это нужно хотя бы вам. По ходу работы цели и приоритеты могут меняться. Начинать надо с минимального прототипа, расширяемого по необходимости, а не с проектирования кроссплатформенного монстра на 123 несуществующих языках.
Можете почитать блог Alconost, чтобы получить представление о локализации.
Ну так то да, можно завернуть, скажем, символ в абстрактный класс и всю клиентскую логику привязывать к нему, а низкий уровень с нудными вопросами по кодировкам оставить реализующему классу.

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

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

Цитата Сообщение от iRomul Посмотреть сообщение
Можете обратить внимание на либу ICU
Лицензия смущает меня. Не понятно заражает ли ICU мой код своей "nonrestrictive" лицензией, после чего любой скачавший мою прогу сможет и с ней делать всё то, что он мог бы делать с ICU по еёйной лицензии. Если я вот, например, закрыл прогу и бесплатна она только для некомерческого использования у меня, сможет ли скачавший мою прогу комерс, прочитав в ней приложенную лицензию ICU, законно забить на мои запреты к бесплатному коммерческому использованию?

Цитата Сообщение от nmcf Посмотреть сообщение
ОС-то какая?
Кроссплатформенная, но покамест на линуксе будет.

Я настроен читать файл в массив байт и бегать по этим байтам как-то.

Цитата Сообщение от nmcf Посмотреть сообщение
Если Windows, то никаких 1251, использовать WCHAR, как там и положено. А в Linux, wchar_t 4-байтный, проблем с индексацией нет.
В виндовсе WCHAR нужен в количестве двух штук иногда. В линуксе wchar_t почти всегда будет выхватывать два символа из текста. Ну это касательно UTF-16, а если файл в родной UTF-8, то там вообще кашу будет зачерпывать.
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
27.10.2015, 09:27
Цитата Сообщение от vipermagi Посмотреть сообщение
алгоритмы обработки текста
Парсер работает с лексемами. А будет в них 1-2-4 ... много байтов (или просто неравномерные битовые коды), это забота лексера. А ему что один бит взять из потока, что 64 ... туда-сюда по дереву кодов.
0
0 / 0 / 0
Регистрация: 26.10.2015
Сообщений: 9
27.10.2015, 11:19  [ТС]
Цитата Сообщение от gazlan Посмотреть сообщение
Парсер работает с лексемами. А будет в них 1-2-4 ... много байтов (или просто неравномерные битовые коды), это забота лексера. А ему что один бит взять из потока, что 64 ... туда-сюда по дереву кодов.
Я не планирую заниматься синтаксическим или лексическим анализом. Во всяком случае на данный момент задачи такой не стоит. Всё намного проще. Например: найти в тексте слово или кусок слова и скопировать предложение, в которое входит найденная подстрока. Ну или абзац там. Нахватать таких предложений или абзацев и склеить в новый текст. Без всяких деревьев и прочих премудростей.
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
27.10.2015, 11:56
Цитата Сообщение от vipermagi Посмотреть сообщение
найти ... и скопировать
Г-н Журден. Что? Когда я говорю: "Николь, принеси мне туфли и ночной колпак", это проза?
Учитель философии. Да, сударь.
© Жан-Батист Мольер. Мещанин во дворянстве
Вы не поверите - это и есть анализ. С деревом решений и прочими "премудростями".
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
27.10.2015, 14:45
В 2-байтовый формат utf16 входит и кириллица и многое другое. Так что если иероглифы не нужны, надолго хватит.
Когда-то это было весь Unicode
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
27.10.2015, 18:32
Цитата Сообщение от vipermagi Посмотреть сообщение
И можно было бы просто взять кодировку UTF-32, но как-то жаба давит
А что мешает сделать typedef, который одним лёгким нажатием будет перещёлкиваться с варианта "2 байта" на вариант "4 байта". Ну и попутно при чтении/записи из/в файл поменяется настройка внутренней кодировки. По-моему ты видишь проблему на пустом месте
0
0 / 0 / 0
Регистрация: 26.10.2015
Сообщений: 9
28.10.2015, 09:16  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
А что мешает сделать typedef, который одним лёгким нажатием будет перещёлкиваться с варианта "2 байта" на вариант "4 байта". Ну и попутно при чтении/записи из/в файл поменяется настройка внутренней кодировки. По-моему ты видишь проблему на пустом месте
Ты предлагаешь на загрузке определять есть ли в тексте символы шире чем 2 байта и включать тогда тайпдеф на 4 для всего текста? Довольно здравая мысль.

Прочитал тут у буржуев, что оказывается повсеместно используется обрезанная двух байтная UTF-16 без заморочек по переключению на 4 байта. Надо бы углубиться в этот увлекательнейший холивар. А пока остановлюсь на варианте определения при загрузке файлов UTF-32 будет или останется 2-х байтный UTF-16; ну и буду иметь в виду ICU.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
28.10.2015, 10:31
Цитата Сообщение от vipermagi Посмотреть сообщение
Ты предлагаешь на загрузке определять есть ли в тексте символы шире чем 2 байта и включать тогда тайпдеф на 4 для всего текста? Довольно здравая мысль
Нет. Я предлагаю сделать typedef размером в 2 байта и так жить. Если вдруг в будущем возникнет потребность использовать 4-байтный вариант, то заменяешь 2 на 4 и в 2-3-4-5 местах исправляешь код программы, где делается связь с внешним миров (чтение-запись файлов). Уверен на 99%, что до 4-байтного варианта дело никогда не дойдёт: либо не будет реальной потребности, либо программа сдохнет раньше, чем появится потребность
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.10.2015, 10:31
Помогаю со студенческими работами здесь

Изменение кодировки Unicode в UTF-8
Нужно переделать Unicode to UTF-8 Пользуюсь функцией string test =...

Перевод текста из кодировки ascii в unicode
Собствено если кто-то имеет идеи о том, как перевести cp1251 или ascii в unicode, и как необходимо считывать старший и младший байт...

Преобразование кодировки USC2 в UNICODE или ASCII
Имеется текст в кодировке USC2, нужно преобразовать в нормальный читаемый. Не могу преобразовать такой текст 0418043704320438 в читаемый...

Смена кодировки utf-8 на unicode у русских букв
Здравствуйте! Прошу помощи с перекодировкой строки вида "\u041f\u0440\u0438\u0435\u0442" в русские букафки. Голову сломал, но в течении...

Ошибка при установке кодировки ASCII в XSL: Unable to translate Unicode character
Добрый день. Не подскажете. Есть исходный файл <?xml version="1.0" encoding="utf-8"?> <names> <name> Тест ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru