|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
02.12.2015, 18:00 | #11 | |
Подтвердите свой е-майл
Регистрация: 12.11.2014
Сообщений: 470
|
Цитата:
1. Буфер для результата преобразования принципиально не резервируем. 2. Как закрыть в класс функцию, принимающую указатель на результат? Или как иначе защититься от невалидного указателя на результат? Сейчас у меня есть класс TUTF8 отдельного символа с констуркторами, принимающими char, wchar_t и char32_t и с оператором-членом приведения к char32_t. Внутренне представление - UTF-8 в резервированном private-массиве Data на 7 байт, за кодом единственного символа идёт нулевой байт. Есть дружественный потоковый класс, а в нём оператор-член вывода в поток, выводящий в поток именно этот массив. Каждый символ строки приводится к TUTF8 и сразу выводится его Data. А как быть с целой строкой? Терминальный ноль завершает всю строку. На паскале я бы написал локальную функцию и не мучался. А на сях? Икладить её в ручную? |
|
02.12.2015, 19:30 | #12 | |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Цитата:
Берите нужный размер да выделяйте память сколько угодно. В плане защиты указателей и/или защиты от неверных указателей все просто - не использовать указатели, вместо них использовать ссылки на класс, который получит результат, в вашем случае это будет какая-то разновидность string класса, либо прямо возвращать класс как результат вызова. Последний раз редактировалось waleri; 02.12.2015 в 19:37. |
|
02.12.2015, 20:00 | #13 | |
Подтвердите свой е-майл
Регистрация: 12.11.2014
Сообщений: 470
|
Цитата:
Динамически. При этом new может вернуть nullptr. И это вместо двадцати байт на стеке с учётом и одиннацати байт на все буфера, и счётчика индекса символа, и переменной для длины строки, и переменной для длины кода символа. Код функции тоже не в куче и размер его достаточно мал и известен. Последний раз редактировалось Stilet; 03.12.2015 в 09:56. |
|
02.12.2015, 22:39 | #14 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
если new вернет nullptr то у меня для вас плохие новости.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
03.12.2015, 00:33 | #15 | ||
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,829
|
По существу заданных вопросов.
Цитата:
Промежуточный буфер на 1024 символа по-любому лучше, чем гонять вызовы MultiByteToWideChar на каждый символ. Функция это не быстрая, на больших объемах просадка скорости будет в разы. Цитата:
В UTF-16 влезет всё, поскольку все кодировки Юникода взаимно-обратимы. Для "верхнего Юникода" есть суррогатные пары, как уже тут говорили. Суррогатные пары корректно работают на системном уровне начиная с XP (может быть только с XP SP2). Если тебе нужен корректный UTF-32, будешь раскодировать их вручную, на Википедии есть алгоритм. Есть также особая четырехбайтовая китайская кодировка GB18030, в которой теоретически могут быть иероглифы, требующие суррогатных пар. Я не настолько глубоко влезал, поэтому точно сказать не могу, могу и ошибаться. GB18030 также поддерживается начиная с XP. Из-за нестандартности у нее куча особенностей, которые описаны в ремарках на MSDN.
В разработке: воспроизводственный контур ИТ
|
||
03.12.2015, 09:35 | #16 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Та еще головная боль...
Например, берем входной ACP буфер размер в N байт и вызываем MultiByteToWideChar и функция возвращает "я сконвертировала 16 символов". Внимание, вопрос, сколько байт нужно пропустить в исходном буфере для конвертации следующих 16 символов? Проще получить нужную длинну и выделить весь буфер целиком и сконвертировать все в один прием. Как ни верти, выделять буфер все равно надо. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как преобразовать строку в название константу или её индификатор | androidz | Общие вопросы Delphi | 10 | 27.02.2014 21:33 |
Как сохранить область на странице вhtml или как картинку или в pdf ? | xxxsas | PHP | 0 | 10.12.2011 12:02 |
Как сделать MD5 строки в utf8? | Anfall | Общие вопросы Delphi | 4 | 04.08.2011 16:54 |
Http.Get, Парсинг UTF8, знак - отображается как ? Как декодировать? | XerSon | Работа с сетью в Delphi | 6 | 10.02.2011 08:37 |
Как получить адрес String строки или преобразовать String | madboy4ik | Общие вопросы по Java, Java SE, Kotlin | 6 | 15.01.2010 11:57 |