1 / 1 / 3
Регистрация: 03.04.2016
Сообщений: 51

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

07.01.2018, 20:07. Показов 4347. Ответов 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,457
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
4144 / 2722 / 433
Регистрация: 09.09.2017
Сообщений: 12,055
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,457
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
4144 / 2722 / 433
Регистрация: 09.09.2017
Сообщений: 12,055
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
4144 / 2722 / 433
Регистрация: 09.09.2017
Сообщений: 12,055
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru