Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
1 / 1 / 3
Регистрация: 03.04.2016
Сообщений: 51

Обработка utf-8

07.01.2018, 20:07. Показов 4529. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Для разминки черепа решил освоить работу с unicode в С
Для общего развития написал функцию split().
Но при проверке работоспособности столкнулся с проблемами.
В некоторых случаях программа завершается с ошибкой.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
#include <string.h>
 
int split(const wchar_t *string, wchar_t delemiter, wchar_t **result);
 
int main(void)
{
    setlocale(LC_CTYPE, "");
    wchar_t *hello = L"надо передавать АДРЕС данного";
    wchar_t delemiter = L' ';
    wchar_t **result;
    int count = 0;
    wprintf(L"%ls\n", hello);
    result = (wchar_t**)malloc(sizeof(wchar_t));
    count = split(hello, delemiter, result);
    wprintf(L"Деление строки по: '%lc'\n", delemiter);
    wprintf(L"Количество - %ld\n", count);
    for (int i = 0; i < count; i++) {
        wprintf(L"%ls\n", result[i]);
    }
    return 0;
}
 
int split(const wchar_t *string, wchar_t delemiter, wchar_t **result) {
    int count = 0;
    int position = 0;
    int old_position = 0;
    size_t lenght;
    wchar_t *ch;
    int i = 0;
    int j = 0;
    ch = wcschr(string+old_position, delemiter);
    if (ch != NULL) {
        do {
            position = ch-string;
            lenght = position - old_position;
            result[i] = (wchar_t*)malloc(lenght * sizeof(wchar_t)+1);
            wmemcpy(result[i], string+old_position, lenght);
            old_position = position + 1;
            count++;
            i++;
        } while((ch = wcschr(string+old_position, delemiter)) != NULL);
        position = wcslen(string)+1;
        lenght = position-1 - old_position;
        result[i] = (wchar_t*)malloc(lenght * sizeof(wchar_t)+1);
        result[i] = string+old_position;
        count++;
        i++;
    }
    else {
        result[0] = (char*)malloc(wcslen(string) * sizeof(char)+1);
        memcpy(result[0], string, wcslen(string));
    }
    return count;
}
Миниатюры
Обработка utf-8   Обработка utf-8   Обработка utf-8  

Обработка utf-8   Обработка utf-8  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.01.2018, 20:07
Ответы с готовыми решениями:

getBytes('UTF-16') даёт UTF-16LE или UTF-16BE?
Добрый день! Делаю J2ME-клиента к некому серверу, исходников которого у меня нет, но есть работающий клиент на C#. Выяснилось, что C#...

<globalization fileEncoding='utf-8' requestEncoding='utf-8' responseEncoding='utf-8' />
Если в коде пишу строку скажем Response.Write ('Вася дурак') - все срабатывает нормально, а если в &lt;body&gt;&lt;h1&gt;Вася...

Конвертация из ASCII в UTF-32 или UTF-8 в UTF-32
Собсно сабж.

31
 Аватар для Olej
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
11.01.2018, 19:58
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Просто приведите пример 5- или 6-байтного UNICODE символа.
Вот прямо сейчас всё кину и стану решать вот ту твою задачку...


Добавлено через 1 минуту
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
... русские символы занимают по 2 байта. А латинские 1 байт, и цифры, и знаки препинания тоже. И что, это для кого-то новость?
Та ты шо!?
А китайские буквы сколько занимают?
И в какой кодировке: UTF-8 или всё таки UTF-32? ... или для тебя они "без разницы"?
0
Почетный модератор
 Аватар для Humanoid
11561 / 4356 / 453
Регистрация: 12.06.2008
Сообщений: 12,458
12.01.2018, 00:07
Цитата Сообщение от Olej Посмотреть сообщение
А если уж говорить точно про стандарты, то это ISO/IEC 10646.2 (версия 2) и ISO/IEC 10646 (версия 3), которая ожидается в этом, 2018-м году.
На счёт версий не знаю, но скачал ISO/IEC 10646 пятую редакцию от 2017-12. Думаю, это можно считать свежим документом, который наиболее близок к стандарту. Там (раздел 9.2) тоже максимум 4 байта в UTF-8.
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
12.01.2018, 04:28
А сколько занимает эта эмодзи в UTF-8? ��*⚕️ (::FEMALE-DOCTOR:: - только маленькими, походу джика форума их не переваривает)

Добавлено через 9 минут
Сории - не совсем понятно - я про это http://www.iemoji.com/view/emo... lth-worker
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,095
12.01.2018, 11:16
Цитата Сообщение от Olej Посмотреть сообщение
Вот прямо сейчас всё кину и стану решать вот ту твою задачку...
То есть даже простейшего подтверждения своих слов вы предоставить не в состоянии? Печально.
Цитата Сообщение от Olej Посмотреть сообщение
А китайские буквы сколько занимают?
Понятия не имею (вроде тоже около 2-х), но во всей таблице символов больше 3 байт мне с ходу найти не удалось
Цитата Сообщение от Olej Посмотреть сообщение
И в какой кодировке: UTF-8 или всё таки UTF-32? ... или для тебя они "без разницы"?
В UNICODE, очевидно же. UTF-8, UTF-16, UTF-32 это лишь представления одного и того же. Так что русская буква она что в UTF-8, что в UTF-32 занимает 2 байта. Правда, в последнем случае резервируется еще 2 байта выравнивания, но они к коду символа отношения не имеют.
Цитата Сообщение от drfaust Посмотреть сообщение
А сколько занимает эта эмодзи в UTF-8? http://www.iemoji.com/view/emo... lth-worker
По ссылке написано что 4 байта
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
12.01.2018, 17:29
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
По ссылке написано что 4 байта
UTF-8 Hex Bytes F0 9F 91 A9, E2 80 8D, E2 9A 95, EF B8 8F
Итого по ссылке 13 байт, а сам смайл является "спайкой" из "UTF-8 Character Count 4"

При обработке текста эта группа должна обрабатывать целиком, иначе порвём смайлик и получим невесть что.
0
Почетный модератор
 Аватар для Humanoid
11561 / 4356 / 453
Регистрация: 12.06.2008
Сообщений: 12,458
12.01.2018, 18:33
Цитата Сообщение от drfaust Посмотреть сообщение
Итого по ссылке 13 байт
Это 4 юникодовских символа, каждый из которых в UTF-8 состоит не более чем из 4 байт. Лично на мой взгляд, это бредовая затея... так они дойдут и до фильмов, состоящих из склеенных юникодовских символов.
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
12.01.2018, 20:45
Цитата Сообщение от Humanoid Посмотреть сообщение
Лично на мой взгляд, это бредовая затея... так они дойдут и до фильмов, состоящих из склеенных юникодовских символов.
Согласен. Но, кажется это полезло из "диактрических" - там, вроде бы были первые "склейки" из двух кодов.
Так что поддержка современного юникода - это головняк, и, я думаю, не только для C/C++...

Добавлено через 9 минут
Если уж эта "медичка" в "UTF-32 Hex 01F469, 200D, 2695, FE0F" занимает 9 байт, даже не 64бита.....
Пора бы уж им определиться на UTF-128 и каждому придуманному символу/иероглифу свой код.

Не по теме:

Только к этому времени найдутся инопланетяне, у которых алфавит будет состоять из базовых 129 символознаков, которые в своей совокупности будут создавать символы, каждый со своим 15^129 значений/оттенков, из которых и будут создаваться слова...

0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
14.01.2018, 07:53
Я вот тут озадачился потренироваться с многобайтом и нарисовать человекоредактируемый парсер ini-файлов.

Есть конечно весьма годный https://github.com/ndevilla/iniparser но работает только с однобайтовым. Если ini в ASCII - проблем нет, если в UTF-8 - могут быть проблемы с национальными строками.

А вот я хочу лопатить ini-файлы независимо от кодировки. Т.е. сделать так, что бы человек мог его редактировать и в линухе, и в винде. Если внутри либы проще файл сразу в wchar_t загнать, то в каком виде его хранить снаружи - виндо-пользователь не сможет его читать/редактировать utf-8, и наоборот. Ему придётся сначала использовать редактор умеющий нужную кодировку или конвертировать с помощью к-либо recode.

Подскажите в какой кодировке лучше всего сохранять ini для любых ОСей, в том числе и MSDOS(ASCII)/древние_фри(KOI-8) Вообще, как быть???
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,095
14.01.2018, 09:31
Самое универсальное - ASCII. Конечно, придется забыть о не-латинских символах. Либо портировать iconv на целевую платформу и тогда использовать любую. Если забыть про всякую древность, лучше остановиться на UTF-8.
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
14.01.2018, 11:11
В том-то и дело - в своей либе опционально хочу сохранять порядок и содержимое комментариев. Опять же - как использовать строковые переменные, значение которых может быть на любом языке.

Может плюнуть на это и работать только в текущей локали? Для ini - использовать utf-8, внутри либы сконвертировать в widechar и не париться с разбором...
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,095
14.01.2018, 11:58
Смотря что вы хотите делать с этими переменными. Если не собираетесь менять или искать подстроки, можно и внутри программы хранить в UTF-8 (обычные Си-строки).
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
14.01.2018, 12:11
Нет менять обязательно + добавление отсутствующих "дефолтных". Тупо читать ini нет никакого интереса - смысл сохранять настройки прог в человекоредактируемом виде, и при этом избежать жирного кода. Готовых-то библиотек море, хоть в xml? хоть классические conf.

Учитывая bison и пр - вообще просто, но посмотрев на реализацию простенького ini через парсеры bison и etcю ужаснулся объёму кода - овер 100Кб экзешника... Хочу написать мелкое и шустрое, минималку, но с возможностями. Тупо альтернативу представленного выше iniparser, но мельче (нафига мне секции, нафига поиск по хэшу и т.п. - без этого, но и что бы комменты при сохранении ini оставались, и с языками проблем небыло).

Скорее всего откажусь от переноса ini из одной ОС в другую - буду использовать системную_текущую локаль с конвертацией в widechar внутри либы и обратным сохранением в локаль. Т.е. для определённой ОСи ini файл вручную человеком будет редактироваться на ура, но не в другой ОСи - там recode и пр конвертаторы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.01.2018, 12:11

XmlSerializer.Serialize() как поменять кодировку с UTF-16 на UTF-8
Задача серилизовать объект в string, но с кодировкой UTF-8. подзадача - как представить строку как Stream? // VALIDATE ...

Изменить кодировку из utf-8 без bom в просто utf-8
формируется xls фаил в коде прописано response.setContexType(&quot;application/vnd.ms-excel;charset=UTF-8&quot; в эксел документе отображается...

Как создать рабочий XML в UTF-8? У меня исправно создаётся Windows-1251, но с UTF-8 проблема
Доброго дня, форумчане. Подскажите, что делать, чтобы создавался и открывался без ошибок XML-файл? Сейчас у меня такой код и если...

Разные кодировки файлов (ASCII, UTF-8, UTF-16)
Привет всем! Нужно написать программу поиска файлов, содержащих заданную строку. Т.е. пользователь выбирает начальный каталог, задаёт...

Преобразование Unicode (UTF-16) в UTF-8 и обратно
Здравствуйте. Признаюсь, снова нужна подмога профессионалов. :help: Перейду к проблеме: Есть файл my_list.dic в кодировке Unicode (а не...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru