Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

получить строку


12345 ©   (2013-10-08 17:12:00) 

есть буфер в котором находится строка и его длина:

Buf: Pointer;
BufLen: Integer;

как его преобразовать в строку?


Dimka Maslov   (2013-10-09 16:06:00) [1]


> Ega23 ©   (09.10.13 14:36) [18]


Даже если строка сферическая в вакууме, то можно попытаться определить, что за строка, unicode, ansi или utf8. Но это уже совсем другая задача.


Ega23   (2013-10-09 14:36:00) [2]


> Тогда вопрос, откуда взялась ansi-строка? Об этом ничего
> не говорится. И вообще у себя я всегда делаю так, чтобы
> ansi-строк было как можно меньше. Совсем ноль. Другое дело,
>  если строка получена извне, что без знания содержимого
> буфера правильно преобразовать в строку невозможно.


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


Dimka Maslov   (2013-10-09 14:17:00) [3]


> Ega23 ©   (09.10.13 13:47) [15]


Тогда вопрос, откуда взялась ansi-строка? Об этом ничего не говорится. И вообще у себя я всегда делаю так, чтобы ansi-строк было как можно меньше. Совсем ноль. Другое дело, если строка получена извне, что без знания содержимого буфера правильно преобразовать в строку невозможно.


> sniknik ©   (09.10.13 12:34) [14]


Порой бывает (например при чтении из буфера обмена), что размер буфера больше, чем расстотяния от нультерминирующего нуля до начала строки. Тогда полученная строка приобретает шумовой хвост, требующий дополнительного отсечения. Но в любом случае, как сказано выше, если процесс я полностью контролирую - подобные вещи появиться не могут, а вот если строка приходит извне - то да, надо быть осторожным и предохраняться.


Германн   (2013-10-09 14:09:00) [4]

Да вообще автору надо было сразу использовать строку (анси или короткую) в качестве приемного буфера. Тогда и вопросов бы глупых не было. :)


Ega23   (2013-10-09 13:47:00) [5]


> Всегда делаю
> S := PChar(P)


По адресу P лежит анси-строка. А Delphi - 2010 (или выше). И приехали.


sniknik   (2013-10-09 12:34:00) [6]

> Всегда делаю
нет гарантий что передается нультерминированная последовательность... даже скорее обратное, т.к. параллельно есть BufLen.
+ при юникоде 0 может быть частью символа, т.к. есть вероятность что в вайл будешь 1 символ сохранять, при n получунных.


Dimka Maslov   (2013-10-09 11:46:00) [7]

Всегда делаю
S := PChar(P)
а проблема с кодировками решается только на момент передачи сохранения в файла, чтения из файла


Inovet   (2013-10-09 10:45:00) [8]

> [11] KilkennyCat ©   (09.10.13 10:32)
> хоть немного, но не полное. например,

когда выключен монитор.


KilkennyCat   (2013-10-09 10:32:00) [9]


> Ega23 ©   (09.10.13 10:22) [10]
>

но ведь оно всегда неполное, тогда. хоть немного, но не полное. например,
> "мама мыла раму"
в шрифте видивингс или как там его.


Ega23   (2013-10-09 10:22:00) [10]


> а причем здесь это?
> у нас есть адрес, есть размер. а квадратиками это на экране
> будет или кириллица, или потребует преобразования - дело
> десятое.


Дык у меня размер буфера, а не размер строки.
"мама мыла раму" - 14 байт в ansi, 28 в utf-16, 26 байт в utf-8.
Неполное условие.


KilkennyCat   (2013-10-09 04:39:00) [11]


> sniknik ©   (09.10.13 02:08) [8]

согласен. бессмысленно


sniknik   (2013-10-09 02:08:00) [12]

> получение массива вместо указателя.
массива? хотят строку. перечитай вопрос.

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

в чем ты видишь тогда ответ, если без преобразований (вернее "типизации"), в бессмысленном копировании байт из одного места в другое?


KilkennyCat   (2013-10-09 01:06:00) [13]


> Германн ©   (09.10.13 00:30) [5]

независит.
преобразование предполагает получение массива вместо указателя.


Inovet   (2013-10-09 00:37:00) [14]

> [5] Германн ©   (09.10.13 00:30)
> SetLength

Для UTF-8 особенно интересно.


Германн   (2013-10-09 00:30:00) [15]


> KilkennyCat ©   (09.10.13 00:10) [4]
>
>
> > Ega23 ©   (08.10.13 21:49) [3]
>
> а причем здесь это?

Так от этого зависит второй параметр SetLength.


KilkennyCat   (2013-10-09 00:10:00) [16]


> Ega23 ©   (08.10.13 21:49) [3]

а причем здесь это?
у нас есть адрес, есть размер. а квадратиками это на экране будет или кириллица, или потребует преобразования - дело десятое.


Ega23   (2013-10-08 21:49:00) [17]

Строка в буфере может быть ансишной, юникодной, утф-8.
Недостаточно условий для однозначного решения.


icWasya   (2013-10-08 17:36:00) [18]

SetString+F1


RWolf   (2013-10-08 17:30:00) [19]

SetLength(s, BufLen);
if BufLen <> 0 then Move(Buf^, s[1], BufLen);


Наверх

Титульная страница Поиск, карта сайта Написать письмо