|
1 / 1 / 3
Регистрация: 03.04.2016
Сообщений: 51
|
||||||
Обработка utf-807.01.2018, 20:07. Показов 4186. Ответов 31
Метки нет (Все метки)
Здравствуйте. Для разминки черепа решил освоить работу с unicode в С
Для общего развития написал функцию split(). Но при проверке работоспособности столкнулся с проблемами. В некоторых случаях программа завершается с ошибкой.
0
|
||||||
| 07.01.2018, 20:07 | |
|
Ответы с готовыми решениями:
31
getBytes('UTF-16') даёт UTF-16LE или UTF-16BE? <globalization fileEncoding='utf-8' requestEncoding='utf-8' responseEncoding='utf-8' /> Конвертация из ASCII в UTF-32 или UTF-8 в UTF-32 |
|
23 / 5 / 1
Регистрация: 05.01.2017
Сообщений: 58
|
|
| 07.01.2018, 23:04 | |
|
Код. отвратителен.
Говорю это, не для того чтоб обидеть. Просто никогда так не пиши! Главное в коде, чтоб ты сам его понимал. Но! тут непонятно с первого взгляда что происходит. 1) Яб отказался от указателей на указатели. Это усложняет код. 2) result[i] = (wchar_t*)malloc(lenght * sizeof(wchar_t)+1); result[i] = string+old_position; ?
0
|
|
|
56 / 93 / 10
Регистрация: 20.03.2017
Сообщений: 550
|
|
| 07.01.2018, 23:10 | |
|
Смысл этого телодвижения? Терминал сам должен поддерживать юникод.
Добавлено через 2 минуты Хотя... . Убунтоводы же. Пишите, чё нет то.
0
|
|
|
23 / 5 / 1
Регистрация: 05.01.2017
Сообщений: 58
|
|
| 07.01.2018, 23:12 | |
|
Смысл есть. т.к. я надеюсь, человек это делает, не для просмотра данных в терминале.
А зачем это ему именно нужно, вопрос десятый.
0
|
|
|
56 / 93 / 10
Регистрация: 20.03.2017
Сообщений: 550
|
|
| 07.01.2018, 23:19 | |
|
rosten, Должно выполняться как минимум 2 условия. Должен быть включён модуль NLC UTF8 и терминал должен поддерживать utf8. Я не в курсе что там за терминал у убунты, глючный наверна какой-то. В первую очередь надо поставить нормальный терминал.
0
|
|
|
23 / 5 / 1
Регистрация: 05.01.2017
Сообщений: 58
|
|
| 07.01.2018, 23:26 | |
|
В первую очередь, нужно ошибку в коде исправить.
Забудьте о терминале. (напридумывали себе что-то. Модуль какой-то(до сего момента, я о такой фигне и не подозревал). Терминал должен, там что-то поддерживать.....нет. Никому он ничего не должен.) Вопрос, был конкретный. О работе с utf-8. Ответ дан.
0
|
|
|
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,024
|
|
| 08.01.2018, 02:30 | |
Сообщение было отмечено Duuly как решение
Решение
Duuly,
в split нужно упорядочить код. сделайте две части кода: 1) поиск позиций разделителей во временный массив; в результате станет точно понятно, на сколько подстрок разделяется исходная строка; позиции разделителей запоминать во временном массиве, который можно выделить динамически, его длина будет не больше, чем всего строк в исходной строке; так что, можно выделить память под позиции размером wcslen(string) 2) заполнение result; заводить result в самой функции split, перед ее вызовом убрать; далее по циклу позиций создавать строки и заполнять уже конкретные result[i] сейчас у вас все в кучу смешано, код не разобрать; правильно заметили, выглядит ужасно. не понятно как оно вообще работает в отдельных случаях
1
|
|
|
1 / 1 / 3
Регистрация: 03.04.2016
Сообщений: 51
|
||||||||||
| 08.01.2018, 21:28 [ТС] | ||||||||||
|
терминал здесь точно не при чем.
функция совсем перестает отрабатывать, но при этом ошибок и падений программы нет. Добавлено через 1 минуту Добавлено через 14 часов 10 минут На свежую голову вот что накодил:
0
|
||||||||||
|
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,024
|
|||
| 08.01.2018, 23:38 | |||
|
Ну и для каждого malloc нет его парного free. Для данной конкретной программы это не ошибка, память будет и так отчищена, но потенциально это тоже ошибка.
1
|
|||
|
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
|
|
| 09.01.2018, 00:17 | |
|
Duuly, зачем вам wchar_t для utf8?
0
|
|
|
1 / 1 / 3
Регистрация: 03.04.2016
Сообщений: 51
|
||||
| 09.01.2018, 08:57 [ТС] | ||||
|
0
|
||||
|
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
|
|
| 09.01.2018, 15:57 | |
|
Duuly, utf-8 ascii-совместимая кодировка с переменной длиной символа (от 1 до 4). Причем первый байт однозначно определяет длину. Пройтись по символам таким образом проблемой не будет. А вот как передать разделитель и с чем сравнивать - тут уже посложнее, чтобы не заниматься сравнением маленьких строк, можно использовать целочисленные code points.
1
|
|
|
1 / 1 / 3
Регистрация: 03.04.2016
Сообщений: 51
|
|
| 09.01.2018, 20:09 [ТС] | |
|
Спасибо, попробую.
0
|
|
|
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
|
|
| 10.01.2018, 20:44 | |
|
0
|
|
|
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
|
|
| 10.01.2018, 20:50 | |
|
Olej, https://tools.ietf.org/html/rfc3629#section-3. Проверяйте информацию перед тем как самоуверенно тыкать.
2
|
|
|
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
|
|||||
| 10.01.2018, 21:02 | |||||
|
А рядом ещё и "Регулярные выражения C/C++" - с учётом локализации. Там детально расписано использование многобайтных кодировок (UTF-8), многобайтных функций mb*(), широких символов (wchar_t, wstring), ... и т.д. P.S. только поспешите, пока здешний модератор не потёр ссылки! ![]() Добавлено через 2 минуты А по вашей дремучей ссылке 2003г. - полное дерьмо написано (по состоянию на 2017г.) Добавлено через 9 минут
(это точно та же история, что и с бездарным переопределением потоков в C++14 ... опять же в угоду Windows, но никто в этом вопросе не собирается отходить от POSIX-определений)
2
|
|||||
|
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
|
||
| 10.01.2018, 21:02 | ||
|
Olej,
0
|
||
|
Почетный модератор
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
|
||
| 11.01.2018, 09:42 | ||
|
Хотя, я тоже где-то встречал UTF-8 из более чем 4 байт. Наверное, это для теоретического предела юникода.
0
|
||
|
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
|
|||||||||
| 11.01.2018, 11:24 | |||||||||
|
1. В современных дистрибутивах Linux всё представляется в кодировке UTF-8: текстовые файлы, текстовые строки, настройки текстовых редакторов и т.д. и т.п. (так же, как это имеет место в ОС Plan 9 или современных языках Python или Go). Когда вы набиваете свой программный код C/C++ в своём любимом текстовом редакторе (IDE), то вы уже вводите все символьные константы (в кавычках) в кодировке UTF-8 ... даже если вы набираете строку "xyz" из примера из K&R 79г. издания. В этом вы можете убедиться, выполнив:
![]() 2. Вы можете, конечно, перенастроить свой любимый текстовый редактор (IDE), указав ему в кодировке какой-то идиотизм ... типа CP-866 или CP-1251 (большинство редакторов такое позволяют). И компилятор благополучно сожрёт это, но на этапе выполнения вы будете иметь большие хлопоты ... а если кто будет позже работать с этим вашим кодом, то поминать вас будет такими словами ... что в гробу вас будет крутить как пропеллер. Такое может допускаться только для очень специальных целей. 3. До тех пор, пока вас не касается внутреннее содержимое строки (контент), вы можете с UTF-8 строками делать достаточно многие вещи не заморачиваясь с их внутренним представлением (strcpy(), strcat() и др.) ... если аккуратно и хорошо понимая что делаете. А вот такие вещи, например, как strlen() или strtok() (с контентом строки) - не прокатят. 4. А wchar_t (или wstring в C++) - это широкие локализованные строки, в Linux это всегда UTF-32, 32-бит на любой символ, в том числе и на ASCII - это "чистое" представление UNICODE символа. Это никакого отношения к мультибайтному представлению UTF-8 не имеет. 5. А для взаимных преобразований между мультибайтными символами/строками UTF-8 и широкими символами/строками UTF-32 есть целая группа функций в стандартной (C99) библиотеке C, вида mb*(): mblen(), mbtowc(), mbstowcs(), wcstombs() и т.д. На всё это добро есть обстоятельные man-ы. А ковырятся во внутреннем побайтном представлении UTF-8 символов - это последнее дело ... это всё равно. что вместо printf() или ncurses - писать непосредственно в область видеопамяти (во времена MS-DOS были такие умельцы). Я это всё написал потому, что в названии темы вы пишете про UTF-8, а в примерах возитесь с UTF-32 ... как-то всё до кучи. Добавлено через 8 минут Иногда они (RFC) используются разработчиками как "почти стандарт" (особенно в области сетевых технологий). Но данный RFC как-раз несколько отличается от того, как и для чего UTF-8 реализовали Кен Томпсон и Роб Пайк в 1992г. (предполагаю, что всем здесь присутствующим эти фамилии говорят о многом). Добавлено через 11 минут Стандарт консорциума UNICODE.
0
|
|||||||||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
|
||
| 11.01.2018, 19:44 | ||
|
Просто приведите пример 5- или 6-байтного UNICODE символа.
0
|
||
| 11.01.2018, 19:44 | |
|
Помогаю со студенческими работами здесь
20
XmlSerializer.Serialize() как поменять кодировку с UTF-16 на UTF-8 Изменить кодировку из utf-8 без bom в просто utf-8 Как создать рабочий XML в UTF-8? У меня исправно создаётся Windows-1251, но с UTF-8 проблема Разные кодировки файлов (ASCII, UTF-8, UTF-16) Преобразование Unicode (UTF-16) в UTF-8 и обратно Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|