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

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

Delphi 2009 и PAnsiChar


Unknown_user ©   (2010-10-31 23:36:00) 

Как правильно преобразовать тип string в PAnsiChar в Delphi 2009?


Unknown_user   (2010-11-01 13:27:00) [1]

>clickmaker

Спасибо, невнимательно читал документацию по BytesOf.


Anatoly Podgoretsky   (2010-11-01 12:55:00) [2]


> преобразование из юникода в анси

И чего тогда обижаешься?


Игорь Шевченко   (2010-11-01 12:24:00) [3]


> То есть записано преобразование из юникода в анси


ну да.


> То почему преобразование в массив байтов функцией BytesOf
> мне возвращает только 3 байта для строки '123'. И это как
> раз ASCII коды символов строки


вот поэтому


clickmaker   (2010-11-01 12:04:00) [4]

WideBytesOf()


Unknown_user   (2010-11-01 11:53:00) [5]

Так Source ведь TEncoding.Unicode. То есть записано преобразование из юникода в анси, с кодовой страницей, используемой по умолчанию. Или я что-то путаю?


Игорь Шевченко   (2010-11-01 11:44:00) [6]


> То почему преобразование в массив байтов функцией BytesOf
> мне возвращает только 3 байта для строки '123'.


потому что TEncoding.Default ?


Unknown_user   (2010-11-01 11:01:00) [7]

Всем спасибо за разъяснения. В заблуждение ввела та легкость с которой делфи преобразовывает PChar в string и наоборот.

Я недавно перешел на Delphi 2009. Читал про unicode строки. Нигде не нашел информацию.
 
var
 S: string;
 Bytes: TBytes;
begin    
 S := '123';
 Bytes := TEncoding.Convert(TEncoding.Unicode, TEncoding.Default, BytesOf(S));
 Result := StringOf(Bytes);
end;

Объясните, пожалуйста как это работает. Если строки в D2009 юникодовские, формат UCS2, то есть минимум 2 байта на символ. То почему преобразование в массив байтов функцией BytesOf мне возвращает только 3 байта для строки '123'. И это как раз ASCII коды символов строки. Получается что BytesOf неявно выполняет преобразование в AnsiString?


Anatoly Podgoretsky   (2010-11-01 07:42:00) [8]

> Unknown_user  (01.11.2010 01:28:06)  [6]

А то, что во втором случае строка прекращает жить по выходу из функции.
И тебе везет, что ты АV не получил, строки то уже нет


Eraser   (2010-11-01 02:40:00) [9]

http://edn.embarcadero.com/article/38446
http://edn.embarcadero.com/article/38582
http://edn.embarcadero.com/article/38703


Servy   (2010-11-01 02:05:00) [10]


> Эта функция должна получать на входе UnicodeString тип Delphi
> 2009 а возвращать PAnsiChar - текстовый буфер в UTF-8 кодировке.
>


Если вы возвращаете указатель (а PAnsiChar ни что иное, как указатель) на буфер - то сей буфер должен быть кем-то потом прибран. Так что, если так необходимо возвращать PAnsiChar - выделяйте память ручками и не забывайте ее освобождать потом. Хотя, куда проще возвращать AnsiString, а в том месте, где его необходимо передавать далее - приводить к типу PAnsiChar. Очевидно, что в этом случае за выделением и освобождением памяти проследит делфи.

Касательно примера с функцией - наружу возвращается указатель (PAnsiChar), которому присвоено значение неявной локальной переменной (AnsiString), которая при выходе за пределы видимости перестает существовать. Так делать не стоит :).


Юрий Зотов   (2010-11-01 01:54:00) [11]


> Unknown_user   (01.11.10 01:28) [6]
> Но в чем разница между
> S1 := PAnsiChar(AnsiString('12345'));
> и вызовом функции
> S1 := StrToAnsiChar('12345');
> которая выполняет то же самое действие, понять не могу.
>

Не то же самое. В первом случае просто присваивается адрес, а во втором идет передача адреса через стек.


Unknown_user   (2010-11-01 01:28:00) [12]

>Anatoly Podgoretsky

Я знаю про счетчики ссылок и автоматическое управление временем жизни строк. Знаю, что при назначении S1 := S2 никакого копирования памяти не происходит пока значение S1 не будет изменено. Но в чем разница между

S1 := PAnsiChar(AnsiString('12345'));

и вызовом функции

S1 := StrToAnsiChar('12345');

которая выполняет то же самое действие, понять не могу.

От функции не могу отказаться, так как в скором времени надо будет кроме преобразования строковых типов добавить в нее конвертацию в UTF-8 формат.

Эта функция должна получать на входе UnicodeString тип Delphi 2009 а возвращать PAnsiChar - текстовый буфер в UTF-8 кодировке.


Anatoly Podgoretsky   (2010-11-01 01:09:00) [13]

Дело в том, что ты не понимаешь как работаю строки, что у них время жизни ограничено и управляется системой.


Anatoly Podgoretsky   (2010-11-01 01:07:00) [14]

> Unknown_user  (01.11.2010 01:00:02)  [2]

Выкинь функцию StrToAnsiChar и делай преобразование, прямо в коде

S1 := PAnsiChar(AnsiString('12345'));


Unknown_user   (2010-11-01 01:03:00) [15]

Если выполнять typecast без вызова своей функции

S1 :=PAnsiChar(AnsiString('12345'));
S2 :=PAnsiChar(AnsiString('ABCDE'));

То каждая строка содержит свое правильное значение.


Unknown_user   (2010-11-01 01:00:00) [16]

Typecast сделать не проблема. Я понимаю как. Но вот что из этого вышло, мне непонятно.

function StrToAnsiChar(S: string): PAnsiChar;
begin
Result := PAnsiChar(AnsiString(S));
end;

procedure TForm8.FormCreate(Sender: TObject);
var
S1, S2: PAnsiChar;
begin
S1 :=StrToAnsiChar('12345');
S2 :=StrToAnsiChar('ABCDE');
ShowMessage('S1=' + S1 + #13#10 + 'S2=' + S2)
end;


Результат работы:

S1 = 'ABCDE'
S2 = 'ABCDE'

Строка S1 вместо значения '12345' содержит значение, которое назначалось второй строке.

Объясните мне пожалуйста сей феномен.


Andy BitOff   (2010-10-31 23:52:00) [17]

http://tinyurl.com/35mzhfl


Наверх

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