Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Конвертация части строки  [new]
Зачем тут все ники уже зарегали
Guest
Добрый день.
Подскажите как можно конвертировать часть строки из одной кодировки в UTF-16LE. В WinAPI есть MultiByteToWideChar, но в ней возможна только полная конвертация строки. Можно задавать уменьшенный размер входного буфера, но я же не знаю какой именно будет размер буфера у строки нужной мне длинны в этой кодировке.
30 сен 17, 12:16    [20833229]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43647

Вариант 1: Конвертируй всё, отсекай ненужное.
Вариант 2: Задавай размер выходного буфера.

Posted via ActualForum NNTP Server 1.5

30 сен 17, 12:55    [20833299]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
трутуту
Guest
Dimitry Sibiryakov,

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

Если у кого есть ещё варианты, то готов выслушать.
30 сен 17, 13:27    [20833327]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43647

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

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

Posted via ActualForum NNTP Server 1.5

30 сен 17, 13:38    [20833337]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
трутуту
Guest
Пример:
Входной буфер 8КБ, к примеру UTF-8
Выходной 8КБ (4096 WideChar)

Все буквы латинские, т.е. размер строки по входному буферу будет 8192 символа. Чтобы сделать конвертацию мне нужен буфер в 2 раза больше, либо передать другой размер входного буфера - 4096, но это значение придется искать методом тыка.
30 сен 17, 13:44    [20833343]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
alekcvp
Member

Откуда:
Сообщений: 395
трутуту
Пример:
Входной буфер 8КБ, к примеру UTF-8
Выходной 8КБ (4096 WideChar)

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


Если ты знаешь размер исходного буфера и то, что там все символы однобайтные, то в чём проблема-то передать в cbMultiByte значение 4096?
30 сен 17, 13:56    [20833358]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43647

трутуту
Входной буфер 8КБ, к примеру UTF-8

Э-э-э, а вот это совершенно гнилая идея, не будет оно работать.

Posted via ActualForum NNTP Server 1.5

30 сен 17, 14:17    [20833376]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
трутуту
Guest
alekcvp,

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

Dimitry Sibiryakov,

Т.е. лучше иметь "одинаковые" буфера, для многобайтовых кодировок - 4096 и 8192 для WideChar, что бы заведомо выходной буфер был равен или больше входного?
30 сен 17, 14:27    [20833385]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2066
трутуту
Если бы я знал какие там символы
Так ты хочешь неизвестно что конвертить? Так не бывает. Разве что случайно наугад.
30 сен 17, 14:31    [20833391]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
трутуту
Guest
YuRock,

Что значит неизвестно что, у меня есть кодовая страница, есть буфер, я хочу получить не весь конвертированный буфер, а только часть, которая помещается в другой буфер. Лично я не вижу никаких сложностей, остановить конвертацию при достижении лимита, но MultiByteToWideChar так не может, вот я и интересуюсь есть ли что ещё для работы с кодировками.
30 сен 17, 15:07    [20833403]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2066
трутуту
у меня есть кодовая страница
UTF-8 - это не кодовая страница. Кодовая страница бывает у кодировок с фиксированным размером символа.
30 сен 17, 15:18    [20833414]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2066
трутуту
остановить конвертацию при достижении лимита, но MultiByteToWideChar
Именно для этого в этой функции и есть параметр - длина входного буффера, который надо сконвертировать. Не понимаю, чего тебе не хватает.
30 сен 17, 15:25    [20833421]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2066
трутуту
я не знаю что у меня за данные в строке, мне нужно получить их часть
Если у тебя часть строки в UTF-8, а часть нет, то границу между ними обязательно надо знать, чтобы эту длину передать в функцию конвертации.
30 сен 17, 15:28    [20833423]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
трутуту
Guest
YuRock,

Работа идет с кодовыми страницами, а UTF-8 я привел как одну из, которые поддерживаются в MultiByteToWideChar и которая точно имеет различный размер в байтах для разных символов. И да, в UTF-8 не вмещается всё множество UTF-32, хоть сейчас оно и не нужно, а раз все (гипотетические) юникодные символы не вмещаются, то это такая же кодовая страница.
30 сен 17, 16:54    [20833474]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43647

трутуту
Лично я не вижу никаких сложностей, остановить конвертацию при достижении лимита, но
MultiByteToWideChar так не может

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

Posted via ActualForum NNTP Server 1.5

30 сен 17, 17:53    [20833539]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2066
трутуту,

Ты можешь объяснить, почему у тебя не получается использовать ф-цию MultiByteToWideChar и её соотв. параметры?
30 сен 17, 18:20    [20833573]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
трутуту
Guest
Dimitry Sibiryakov
трутуту
Лично я не вижу никаких сложностей, остановить конвертацию при достижении лимита, но
MultiByteToWideChar так не может

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

Мне это сказала Windows 8, вернув ошибку: Область данных, переданная по системному вызову, слишком мала.
30 сен 17, 18:29    [20833587]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
трутуту
Guest
YuRock
трутуту,

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


Вроде мой пример полностью описывает ситуацию и там же описано, что так эта функция не работает. Если же речь идет об указании размера входного буфера, такого что бы размер выходной строки был заданного размера, то его нужно сначала как-то высчитать.
30 сен 17, 18:33    [20833591]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2066
трутуту
Dimitry Sibiryakov
пропущено...

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

Мне это сказала Windows 8, вернув ошибку: Область данных, переданная по системному вызову, слишком мала.
Эта ошибка выдается в результате расчета, а не потому, что "не умеет". Просто ты передал слишком маленький буффер для результата, наверно.
Как ты определил размер этого буффера? Подсказка: его размер можно спросить у Windows 8.
30 сен 17, 18:34    [20833593]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
трутуту
Guest
Dimitry Sibiryakov
трутуту
Спасибо, значит буду искать размер буфера при котором на выходе будет нужная длина строки.

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


Размер входного массива для MultiByteToWideChar указывается в байтах, для выходного - в символах.
30 сен 17, 18:34    [20833594]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
трутуту
Guest
YuRock
трутуту
пропущено...

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


У меня как раз и стоит задача получить часть строки, потому и выходной буфер меньшего размера.
30 сен 17, 18:36    [20833595]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2066
трутуту
что так эта функция не работает

Эта функция работает именно так и только так.

трутуту
что бы размер выходной строки был заданного размера, то его нужно сначала как-то высчитать.

Совет: прочитай уже справку msdn по этой функции.
30 сен 17, 18:38    [20833598]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2066
трутуту
Вроде мой пример полностью описывает ситуацию
Ты не привел никакого примера, одни слова.

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

Бред какой-то. Передавай часть строки во входной буффер, вот и все проблемы.
30 сен 17, 18:41    [20833603]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43647

трутуту
Мне это сказала Windows 8, вернув ошибку: Область данных, переданная по системному вызову,
слишком мала.

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

Posted via ActualForum NNTP Server 1.5

30 сен 17, 18:47    [20833607]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация части строки  [new]
трутуту
Guest
YuRock
трутуту
Вроде мой пример полностью описывает ситуацию
Ты не привел никакого примера, одни слова.

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

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


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

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


Идея интересная (и верная), но не стоит опираться на не документируемые возможности, ни что не мешает в следующем обновлении изменить поведение функции.
30 сен 17, 19:24    [20833645]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить