массив байтов в строку

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

массив байтов в строку

Сообщение AlexEr81 » 28.01.2014 12:37:13

Здравствуйте. Подскажите пожалуйста, а то я никак не соображу:
есть массив байтов - pbData: PByte; их количество - cbData: DWORD там русскоязычный текст представленный в формате UNICODE, где каждый символ кодируется двумя байтами (16 бит)закодирован по стандарту UTF-8
как из массива получить строку string?
делаю:
Код: Выделить всё
for I := cbData - 1 downto 0 do
begin
S := chr(PByteArray(pbData)^[i]);
Result := S + Result;
end;

текст получается но впереди строки мусор, пара лишних символов.

может есть какая то функция в лазаре?
AlexEr81
новенький
 
Сообщения: 17
Зарегистрирован: 24.01.2014 19:57:31

Re: массив байтов в строку

Сообщение hinst » 28.01.2014 13:49:09

Что если впереди строки стоит Byte Order Mark?
http://ru.wikipedia.org/wiki/Маркер_последовательности_байтов
Вообще я бы попробовал так:
Код: Выделить всё
s := UTF8String(PChar(pbData));

Или так:
Код: Выделить всё
s := UnicodeString(PChar(pbData));

Я, в общем, не понял по описанию, там всё таки Unicode или UTF-8 лежит
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: массив байтов в строку

Сообщение AlexEr81 » 28.01.2014 14:58:57

обе функции дают тот же результат что и тот код что я написал.
по описанию там текст UTF8string
pbData=0C 2B 22 D0 9A D1 80 D0 B8 D0 BF D1 82 D0 BE D0 9F D1 80 D0 BE 20 43 53 50 22 20 28 D0 B2 D0 B5 D1 80 D1 81 D0 B8 D1 8F 20 33 2E 36 29
s := UTF8String(PChar(pbData));
получается s= T+"КриптоПро CSP" (версия 3.6)
вместо T там символ сюда не копируется, выглядит как крестик с кружком наверху

Добавлено спустя 35 минут 43 секунды:
тут я так понимаю русские буквы кодированы 2 байтами а остальные символы одним.
наверно всё правильно преобразуется. надо просто отбрасывать первые 2 байта
AlexEr81
новенький
 
Сообщения: 17
Зарегистрирован: 24.01.2014 19:57:31

Re: массив байтов в строку

Сообщение hinst » 28.01.2014 15:52:49

кстате когда делаешь вот так:
s := UTF8String(PChar(pbData));
то он ищет конец строки по 0-символу, так что нужно, чтобы он был, либо делать по-другому, через SetLength и Move, иначе будет всё очень плохо
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot] и гости: 209

Рейтинг@Mail.ru