![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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