Нужна функция PointerToStringCyrillic (CP866 To UTF8)

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

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

Нужна функция PointerToStringCyrillic (CP866 To UTF8)

Сообщение nic1982 » 26.11.2015 11:12:24

Есть Pointer который указывает на адрес в памяти где хранятся строка с кириллическими символами.
Кириллические символы в кодировке CP866 (под каждый символ отводится один байт).
Последний символ в строке нулевой 00h.

Как их считать в String (UTF8) ?

То есть нужна функция PointerToStringCyrillic.

Латиницу смог победить вот так:
Код: Выделить всё
function PointerToString(p : pointer) : string;
var
  i     : longint;
  tmp_s : string;
  out_s : string;

begin

  i:= 1;
  out_s:= '';
  tmp_s:= string(p);

  while tmp_s[i] <> #00 do
  begin
    out_s:= out_s + tmp_s[i];
    inc(i);
  end;

  PointerToString:= out_s;

end;
nic1982
новенький
 
Сообщения: 48
Зарегистрирован: 17.05.2011 16:34:05

Re: Нужна функция PointerToStringCyrillic (CP866 To UTF8)

Сообщение Лекс Айрин » 26.11.2015 11:26:59

А чем не нравится стандартный способ доступа с разыменованием указателя?

Код: Выделить всё
Var
Str:String;
PStr:^String;
...
Begin
...
Str:=ConsoleToUTF8(@PStr);
....
end

Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Нужна функция PointerToStringCyrillic (CP866 To UTF8)

Сообщение daesher » 26.11.2015 14:07:43

Лекс Айрин писал(а):Str:=ConsoleToUTF8(@PStr);

Я, конечно, не ахти какой специалист в юникоде, но @PStr - это что-то не то. Берётся указатель на указатель. Зачем?
Идея проще: указатель превращается в PСhar, PChar - в RawByteString, а уже потом можно это гнать в ConsoleToUTF8.
daesher
постоялец
 
Сообщения: 221
Зарегистрирован: 09.03.2010 22:17:14

Re: Нужна функция PointerToStringCyrillic (CP866 To UTF8)

Сообщение nic1982 » 26.11.2015 14:51:23

Пока решил так:
Код: Выделить всё
function PointerToStringCyrillic(p : pointer; len : longint) : string;
var
  i : longint;
  s : string;

begin

  s:= '';
  i:= 0;

  //while Byte(p^) <> $00 do // вариант 1-й, до $00

  while len > i do           // вариант 2-й, по длине
  begin

    s:= s + CP866ToUTF8(Chr(Byte(p^)));

    inc(p);
    inc(i);

  end;

  PointerToStringCyrillic:= s;

end;
nic1982
новенький
 
Сообщения: 48
Зарегистрирован: 17.05.2011 16:34:05

Re: Нужна функция PointerToStringCyrillic (CP866 To UTF8)

Сообщение Лекс Айрин » 26.11.2015 16:02:38

daesher писал(а):Я, конечно, не ахти какой специалист в юникоде, но @PStr - это что-то не то. Берётся указатель на указатель. Зачем?
Идея проще: указатель превращается в PСhar, PChar - в RawByteString, а уже потом можно это гнать в ConsoleToUTF8.


Пардон, вот что значит давно не использовать указатели(((... Но зачем Вам такой длинный путь? Проще же разыменовать всю строку сразу. И тогда Ваша функция превратится в...
Код: Выделить всё
function PointerToStringCyrillic(var p : pointer;) : string;
begin
     Result:= CP866ToUTF8(P^);

//Если не сработает этот способ, то можно привести тип поиск в нете говорит, что примерно так
{Result:= PChar(P)^;
Result:= CP866ToUTF8( Result);              }
end;


Кстати, не подскажете зачем нужна переменная Len, если Вы используете PChar? Вы точно знаете размер строки?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград


Вернуться в Lazarus

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 243

Рейтинг@Mail.ru