Форум: "Начинающим";
Текущий архив: 2014.08.31;
Скачать: [xml.tar.bz2];
Внизполучить строку Найти похожие ветки
← →
12345 (2013-10-08 17:12) [0]есть буфер в котором находится строка и его длина:
Buf: Pointer;
BufLen: Integer;
как его преобразовать в строку?
← →
RWolf © (2013-10-08 17:30) [1]
SetLength(s, BufLen);
if BufLen <> 0 then Move(Buf^, s[1], BufLen);
← →
icWasya © (2013-10-08 17:36) [2]SetString+F1
← →
Ega23 © (2013-10-08 21:49) [3]Строка в буфере может быть ансишной, юникодной, утф-8.
Недостаточно условий для однозначного решения.
← →
KilkennyCat © (2013-10-09 00:10) [4]
> Ega23 © (08.10.13 21:49) [3]
а причем здесь это?
у нас есть адрес, есть размер. а квадратиками это на экране будет или кириллица, или потребует преобразования - дело десятое.
← →
Германн © (2013-10-09 00:30) [5]
> KilkennyCat © (09.10.13 00:10) [4]
>
>
> > Ega23 © (08.10.13 21:49) [3]
>
> а причем здесь это?
Так от этого зависит второй параметр SetLength.
← →
Inovet © (2013-10-09 00:37) [6]> [5] Германн © (09.10.13 00:30)
> SetLength
Для UTF-8 особенно интересно.
← →
KilkennyCat © (2013-10-09 01:06) [7]
> Германн © (09.10.13 00:30) [5]
независит.
преобразование предполагает получение массива вместо указателя.
← →
sniknik © (2013-10-09 02:08) [8]> получение массива вместо указателя.
массива? хотят строку. перечитай вопрос.
если бы нужен был массив, то посоветовал бы вообще ничего не делать, без разницы, что не типизированный указатель на последовательность байт, что указатель массива на те же байты... какая разница?
в чем ты видишь тогда ответ, если без преобразований (вернее "типизации"), в бессмысленном копировании байт из одного места в другое?
← →
KilkennyCat © (2013-10-09 04:39) [9]
> sniknik © (09.10.13 02:08) [8]
согласен. бессмысленно
← →
Ega23 © (2013-10-09 10:22) [10]
> а причем здесь это?
> у нас есть адрес, есть размер. а квадратиками это на экране
> будет или кириллица, или потребует преобразования - дело
> десятое.
Дык у меня размер буфера, а не размер строки.
"мама мыла раму" - 14 байт в ansi, 28 в utf-16, 26 байт в utf-8.
Неполное условие.
← →
KilkennyCat © (2013-10-09 10:32) [11]
> Ega23 © (09.10.13 10:22) [10]
>
но ведь оно всегда неполное, тогда. хоть немного, но не полное. например,
> "мама мыла раму"
в шрифте видивингс или как там его.
← →
Inovet © (2013-10-09 10:45) [12]> [11] KilkennyCat © (09.10.13 10:32)
> хоть немного, но не полное. например,
когда выключен монитор.
← →
Dimka Maslov © (2013-10-09 11:46) [13]Всегда делаю
S := PChar(P)
а проблема с кодировками решается только на момент передачи сохранения в файла, чтения из файла
← →
sniknik © (2013-10-09 12:34) [14]> Всегда делаю
нет гарантий что передается нультерминированная последовательность... даже скорее обратное, т.к. параллельно есть BufLen.
+ при юникоде 0 может быть частью символа, т.к. есть вероятность что в вайл будешь 1 символ сохранять, при n получунных.
← →
Ega23 © (2013-10-09 13:47) [15]
> Всегда делаю
> S := PChar(P)
По адресу P лежит анси-строка. А Delphi - 2010 (или выше). И приехали.
← →
Германн © (2013-10-09 14:09) [16]Да вообще автору надо было сразу использовать строку (анси или короткую) в качестве приемного буфера. Тогда и вопросов бы глупых не было. :)
← →
Dimka Maslov © (2013-10-09 14:17) [17]
> Ega23 © (09.10.13 13:47) [15]
Тогда вопрос, откуда взялась ansi-строка? Об этом ничего не говорится. И вообще у себя я всегда делаю так, чтобы ansi-строк было как можно меньше. Совсем ноль. Другое дело, если строка получена извне, что без знания содержимого буфера правильно преобразовать в строку невозможно.
> sniknik © (09.10.13 12:34) [14]
Порой бывает (например при чтении из буфера обмена), что размер буфера больше, чем расстотяния от нультерминирующего нуля до начала строки. Тогда полученная строка приобретает шумовой хвост, требующий дополнительного отсечения. Но в любом случае, как сказано выше, если процесс я полностью контролирую - подобные вещи появиться не могут, а вот если строка приходит извне - то да, надо быть осторожным и предохраняться.
← →
Ega23 © (2013-10-09 14:36) [18]
> Тогда вопрос, откуда взялась ansi-строка? Об этом ничего
> не говорится. И вообще у себя я всегда делаю так, чтобы
> ansi-строк было как можно меньше. Совсем ноль. Другое дело,
> если строка получена извне, что без знания содержимого
> буфера правильно преобразовать в строку невозможно.
Ну мы же сейчас сферическую строку в вакууме разбираем, не так ли? По крайней мере, изначальный сабж выглядит именно так: что за строка - неизвестно, кто этот буфер сформировал - неизвестно.
Именно потому я и написал, что данные неполные.
← →
Dimka Maslov © (2013-10-09 16:06) [19]
> Ega23 © (09.10.13 14:36) [18]
Даже если строка сферическая в вакууме, то можно попытаться определить, что за строка, unicode, ansi или utf8. Но это уже совсем другая задача.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2014.08.31;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.002 c