Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
#1

utf-8 <-> int32 - C++

18.07.2012, 22:23. Просмотров 1071. Ответов 11
Метки нет (Все метки)

Есть строка s формата utf-8 длины l и число n типа int32 или uint32, которое является уникальным идентификатором строки s.
Какие существуют алгоритмы или готовые библиотеки для нахождения s, зная n и нахождения n, зная s. И какое будет максимально возможное значение l?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2012, 22:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос utf-8 <-> int32 (C++):

Utf->win - C++ Builder
Добрый день. У меня такая проблема. Мне надо перекодировать строку =?utf-8?B?0J3QvtC80LXRgCDQt9Cw0LrQsNC30LAgMTAwMDYwNTk=?= в win1251. ...

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

Конкатенация двух переменных типа int32 - C++
Друзья, уже третий день бьюсь с проблемой объединения двух получаемых из файла строк Uint32. Можно ли как-то вообще реализовать это в С++...

Преобразовние Utf-16 <=> Utf-8 - C++
Вопрос казалось бы простой, но нормально ответа на него я пока не нашел. Нужно вывести строчку юникода(UTF-16) в файл с изменением...

C и UTF-8 - C++
Как для приложения на C установить кодировку UTF-8? Чтобы символы на кирилице выводились и вводились нормально.

Кириллицу в UTF-8 - C++
К примеру, у нас есть строка &quot;тест&quot;, нужно из него получить строку D1%82%D0%B5%D1%81%D1%82 для запроса

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nick Alte
Эксперт С++
1637 / 1009 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
19.07.2012, 08:43 #2
n = CRC32(s, l) в сочетании с std::map<uint32_t, std::string> (а лучше std::unordered_map), если я правильно понял вопрос. Максимально возможное значение l определяется теми же соображениями, что и при работе с обычными std::string.
1
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
19.07.2012, 12:20  [ТС] #3
Nick Alte, на сколько я знаю, CRC32 работает только в одну сторону. Из полученного численного значения нельзя восстановить строку, а мне это нужно. Потому что в моем случае я могу знать только int и только string.
0
modwind
52 / 52 / 1
Регистрация: 09.03.2012
Сообщений: 101
19.07.2012, 12:56 #4
Если число n не должно быть одинаковым для одних и тех же строк, можно использовать указатель на строку в памяти (char*) в качестве числа n. Тогда поиск будет тривиальным.

Зачем восстанавливать n по s мне непонятно. Можешь подробнее объяснить свою цель?

Добавлено через 2 минуты
Точнее, какой смысл имеет число n в решаемой задаче, как оно используется?
1
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
19.07.2012, 13:05  [ТС] #5
modwind, хочу сделать эмуляцию браузера для работы с технологией npapi. Там такая фича используется. Браузер предоставляет операции n -> s и s-> n и с помощью них работает с плагином. Он может послать плагину как n, так и s. Причем n точно соответствует s и наоборот.
0
modwind
52 / 52 / 1
Регистрация: 09.03.2012
Сообщений: 101
19.07.2012, 13:13 #6
Ну, можно создать map<int,string> и map<string,int>, если обе операции преобразования надо выполнять быстро, а в 2 раза больший объём занимаемой памяти не проблема.

Иначе один map<int,string>. А поиск числа по строке осуществлять линейным перебором всех элементов map-а, что дольше по времени.
0
Nick Alte
Эксперт С++
1637 / 1009 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
19.07.2012, 14:42 #7
Цитата Сообщение от gooseim Посмотреть сообщение
Nick Alte, на сколько я знаю, CRC32 работает только в одну сторону.
Так надо ж внимательно читать. В одну сторону CRC32, в обратную - map или unordered_map.
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
19.07.2012, 14:46  [ТС] #8
Если я знаю n, а не знаю s, то что мне делать?
0
Nick Alte
Эксперт С++
1637 / 1009 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
19.07.2012, 15:53 #9
Если знаешь n, то запроси в map соответствующий ему s.
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
19.07.2012, 16:37  [ТС] #10
Nick Alte, если в мап нет никакой s, связанной с n?
есть map<s, n>
1. знаем s
2. вычисляем CRC32(s) = n
3. map[s] = n;
это все понятно, зная s
а что делать, если задан n, но не задан s?
1. знаем n
2. ?
0
Nick Alte
Эксперт С++
1637 / 1009 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
19.07.2012, 18:50 #11
Так надо заносить все s в этот map. А идея запихнуть вообще любую строку в 32 бита и потом без потерь и без дополнительной информации восстановить обратно наивна и утопична. Связь между строкой и её числовым идентификатором надо однозначно регистрировать через map, без этого никуда. Разве что все строки будут не более 4 байтов в длину, тогда их можно прямо использовать в качестве собственных идентификаторов. Так что схема такая: при создании любой строки s регистрируем пару s - CRC32(s) в map. При этом CRC32 выступает именно уникальным идентификатором строки (о коллизиях не беспокоимся при количестве строк где-то до 10 000) и его, разумеется, легко и просто можно вычислить безо всяких map, имея саму строку. Далее:

Если знаем s
n = CRC32(s)

Если знаем n
s = myMap[n]
2
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
19.07.2012, 18:56  [ТС] #12
Nick Alte, вот теперь спасибо.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2012, 18:56
Привет! Вот еще темы с ответами:

Кириллица в UTF-8 - C++
Отдельно задам ранее возникший вопрос. При работе с однобайтовой кодировкой (например, в старом борланде 3.1, где, если я правильно понял,...

From UTF-8 to UNICODE - C++
здравствуйте!! у меня вот какой вопрос! Как сделать преобразование UTF-8 и Unicode? во общем моя программа считывает данные с базы( база...

C++, UTF-8, char - C++
Приветсвую всех. Правильно ли я рассуждаю: 1) Если мне нужно использовать символы юникода в программе (самые немыслимые иероглифы,...

Парсер, utf-8 - C++
Помогите пожалуйста разобраться с кодировкой. Прочитал немного статей и литературы, но полного понимание ситуации с кодировкой так и нет....


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.07.2012, 18:56
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru