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

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

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

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

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

Сообщение nic1982 »

Есть 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;
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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

Код: Выделить всё

Var
Str:String;
PStr:^String;
...
Begin
...
Str:=ConsoleToUTF8(@PStr);
....
end

daesher
постоялец
Сообщения: 221
Зарегистрирован: 09.03.2010 21:17:14

Сообщение daesher »

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

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

Сообщение nic1982 »

Пока решил так:

Код: Выделить всё

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;
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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? Вы точно знаете размер строки?
Ответить