powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Конвертация части строки
25 сообщений из 27, страница 1 из 2
Конвертация части строки
    #39528781
Добрый день.
Подскажите как можно конвертировать часть строки из одной кодировки в UTF-16LE. В WinAPI есть MultiByteToWideChar, но в ней возможна только полная конвертация строки. Можно задавать уменьшенный размер входного буфера, но я же не знаю какой именно будет размер буфера у строки нужной мне длинны в этой кодировке.
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528795
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант 1: Конвертируй всё, отсекай ненужное.
Вариант 2: Задавай размер выходного буфера.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528799
трутуту
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Спасибо, значит буду искать размер буфера при котором на выходе будет нужная длина строки.

Если у кого есть ещё варианты, то готов выслушать.
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528800
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
трутутуСпасибо, значит буду искать размер буфера при котором на выходе будет нужная длина строки.

Зачем его искать, если он явно указывается в символах, а не байтах? Или "нужная длина" у
тебя в пикселях, а не символах?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528801
трутуту
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример:
Входной буфер 8КБ, к примеру UTF-8
Выходной 8КБ (4096 WideChar)

Все буквы латинские, т.е. размер строки по входному буферу будет 8192 символа. Чтобы сделать конвертацию мне нужен буфер в 2 раза больше, либо передать другой размер входного буфера - 4096, но это значение придется искать методом тыка.
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528803
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
трутутуПример:
Входной буфер 8КБ, к примеру UTF-8
Выходной 8КБ (4096 WideChar)

Все буквы латинские, т.е. размер строки по входному буферу будет 8192 символа. Чтобы сделать конвертацию мне нужен буфер в 2 раза больше, либо передать другой размер входного буфера - 4096, но это значение придется искать методом тыка.

Если ты знаешь размер исходного буфера и то, что там все символы однобайтные, то в чём проблема-то передать в cbMultiByte значение 4096?
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528811
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
трутутуВходной буфер 8КБ, к примеру UTF-8

Э-э-э, а вот это совершенно гнилая идея, не будет оно работать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528816
трутуту
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp,

Если бы я знал какие там символы я бы даже функцией MultiByteToWideChar не пользовался. Естественно я не знаю что у меня за данные в строке, мне нужно получить их часть.

Dimitry Sibiryakov,

Т.е. лучше иметь "одинаковые" буфера, для многобайтовых кодировок - 4096 и 8192 для WideChar, что бы заведомо выходной буфер был равен или больше входного?
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528818
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
трутутуЕсли бы я знал какие там символыТак ты хочешь неизвестно что конвертить? Так не бывает. Разве что случайно наугад.
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528827
трутуту
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock,

Что значит неизвестно что, у меня есть кодовая страница, есть буфер, я хочу получить не весь конвертированный буфер, а только часть, которая помещается в другой буфер. Лично я не вижу никаких сложностей, остановить конвертацию при достижении лимита, но MultiByteToWideChar так не может, вот я и интересуюсь есть ли что ещё для работы с кодировками.
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528833
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
трутутуу меня есть кодовая страницаUTF-8 - это не кодовая страница. Кодовая страница бывает у кодировок с фиксированным размером символа.
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528835
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
трутутуостановить конвертацию при достижении лимита, но MultiByteToWideCharИменно для этого в этой функции и есть параметр - длина входного буффера, который надо сконвертировать. Не понимаю, чего тебе не хватает.
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528837
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
трутутуя не знаю что у меня за данные в строке, мне нужно получить их частьЕсли у тебя часть строки в UTF-8, а часть нет, то границу между ними обязательно надо знать, чтобы эту длину передать в функцию конвертации.
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528854
трутуту
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock,

Работа идет с кодовыми страницами, а UTF-8 я привел как одну из, которые поддерживаются в MultiByteToWideChar и которая точно имеет различный размер в байтах для разных символов. И да, в UTF-8 не вмещается всё множество UTF-32, хоть сейчас оно и не нужно, а раз все (гипотетические) юникодные символы не вмещаются, то это такая же кодовая страница.
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528860
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
трутутуЛично я не вижу никаких сложностей, остановить конвертацию при достижении лимита, но
MultiByteToWideChar так не может

Кто тебе это сказал? Никогда больше его не слушай, он лжец.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528862
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
трутуту,

Ты можешь объяснить, почему у тебя не получается использовать ф-цию MultiByteToWideChar и её соотв. параметры?
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528865
трутуту
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovтрутутуЛично я не вижу никаких сложностей, остановить конвертацию при достижении лимита, но
MultiByteToWideChar так не может

Кто тебе это сказал? Никогда больше его не слушай, он лжец.

Мне это сказала Windows 8, вернув ошибку: Область данных, переданная по системному вызову, слишком мала.
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528866
трутуту
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockтрутуту,

Ты можешь объяснить, почему у тебя не получается использовать ф-цию MultiByteToWideChar и её соотв. параметры?

Вроде мой пример полностью описывает ситуацию и там же описано, что так эта функция не работает. Если же речь идет об указании размера входного буфера, такого что бы размер выходной строки был заданного размера, то его нужно сначала как-то высчитать.
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528867
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
трутутуDimitry Sibiryakovпропущено...

Кто тебе это сказал? Никогда больше его не слушай, он лжец.

Мне это сказала Windows 8, вернув ошибку: Область данных, переданная по системному вызову, слишком мала.Эта ошибка выдается в результате расчета, а не потому, что "не умеет". Просто ты передал слишком маленький буффер для результата, наверно.
Как ты определил размер этого буффера? Подсказка: его размер можно спросить у Windows 8.
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528868
трутуту
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovтрутутуСпасибо, значит буду искать размер буфера при котором на выходе будет нужная длина строки.

Зачем его искать, если он явно указывается в символах, а не байтах? Или "нужная длина" у
тебя в пикселях, а не символах?..


Размер входного массива для MultiByteToWideChar указывается в байтах, для выходного - в символах.
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528869
трутуту
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockтрутутупропущено...

Мне это сказала Windows 8, вернув ошибку: Область данных, переданная по системному вызову, слишком мала.Эта ошибка выдается в результате расчета, а не потому, что "не умеет". Просто ты передал слишком маленький буффер для результата, наверно.
Как ты определил размер этого буффера? Подсказка: его размер можно спросить у Windows 8.

У меня как раз и стоит задача получить часть строки, потому и выходной буфер меньшего размера.
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528870
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
трутутучто так эта функция не работает
Эта функция работает именно так и только так.

трутутучто бы размер выходной строки был заданного размера, то его нужно сначала как-то высчитать.
Совет: прочитай уже справку msdn по этой функции.
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528871
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
трутутуВроде мой пример полностью описывает ситуациюТы не привел никакого примера, одни слова.

трутутуУ меня как раз и стоит задача получить часть строки, потому и выходной буфер меньшего размера.
Бред какой-то. Передавай часть строки во входной буффер, вот и все проблемы.
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528872
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
трутутуМне это сказала Windows 8, вернув ошибку: Область данных, переданная по системному вызову,
слишком мала.

И это логично, поскольку она действительно мала. Но с чего ты решил, что выходной буфер
при этом не заполнился под завязку прежде, чем функция вернула ошибку?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Конвертация части строки
    #39528879
трутуту
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockтрутутуВроде мой пример полностью описывает ситуациюТы не привел никакого примера, одни слова.

трутутуУ меня как раз и стоит задача получить часть строки, потому и выходной буфер меньшего размера.
Бред какой-то. Передавай часть строки во входной буффер, вот и все проблемы.

Проблематично передавать нужную часть буфера, когда ты не знаешь что там, а не знаешь, т.к. ещё не перевел в читаемый формат.

Dimitry SibiryakovИ это логично, поскольку она действительно мала. Но с чего ты решил, что выходной буфер
при этом не заполнился под завязку прежде, чем функция вернула ошибку?

Идея интересная (и верная), но не стоит опираться на не документируемые возможности, ни что не мешает в следующем обновлении изменить поведение функции.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Конвертация части строки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]