Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2015, 08:25   #11
Должно быть имя?
Пользователь
 
Регистрация: 11.04.2015
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А почему тогда через PБлаБлаChar? Почему не именно строку как обычно?
И Зачем столько разных функций? Я бы например использовал не их а класс TEncoding - надежнее получилось бы.
Ну если ты еще не заметил, я использую структуру, и в нее прилетают данные из другого ОПП. так что тут уже ничего не по пишешь

Код:
  Pzvalue_value = ^zvalue_value;
  zvalue_value = record
    case integer of
      0: (lval	: Longint;);
      1: (dval	: double;);
      2: (str	: record
					  val	: PAnsiChar;
					  len	: LongInt;
				  end;);
      3: (ht	: PHashTable;);
      4: (obj	: zend_object_value;);
  end;

  pppzval = ^ppzval;
  ppzval = ^pzval;
  pzval = ^zval;

  zval = record
    value         : zvalue_value;
    refcount__gc  : uint;
    _type         : Byte;
    is_ref__gc    : Byte;
  end;

Функций столько, чтоб создать нормальный функционал для работы, и не мается потом вручную

Последний раз редактировалось Должно быть имя?; 12.04.2015 в 08:28.
Должно быть имя? вне форума Ответить с цитированием
Старый 12.04.2015, 08:36   #12
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
так что тут уже ничего не по пишешь
Мне на все про все хватает всегда две функции: AnsiToUtf8() и Utf8ToAnsi(). Плюс сюда же TEncoding. Я конечно отговаривать тебя не стану, это так, к слову, но смысла в куче функций я не вижу.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.04.2015, 08:51   #13
Должно быть имя?
Пользователь
 
Регистрация: 11.04.2015
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Мне на все про все хватает всегда две функции: AnsiToUtf8() и Utf8ToAnsi(). Плюс сюда же TEncoding. Я конечно отговаривать тебя не стану, это так, к слову, но смысла в куче функций я не вижу.
А я как раз таки вижу смысл, если я потом захочу через RTTI взаимодействовать на классы, то мне нужен будет функционал получения строки в разных типах

Я конечно могу и без UTF8 оставить, тока думаю что в будущем с этим проблемы будут, и до проблемы не кому дела не будет
Должно быть имя? вне форума Ответить с цитированием
Старый 12.04.2015, 08:52   #14
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от Должно быть имя? Посмотреть сообщение
Ну если ты еще не заметил, я использую структуру, и в нее прилетают данные из другого ОПП. так что тут уже ничего не по пишешь
В этом и есть смысл TEncoding - для вас существует только string. Если строку надо куда-то отдать, то отдаёте вы байты, которые для вас построит TEncoding. Если вы хотите принять строку, то принимаете вы опять же набор байт, а string для вас из них построит TEncoding.
Embarcadero уже относительно давно форсит идею, что строковый тип должен быть строго один. Всё остальное - это legacy =-)
StriderX вне форума Ответить с цитированием
Старый 12.04.2015, 09:04   #15
Должно быть имя?
Пользователь
 
Регистрация: 11.04.2015
Сообщений: 68
По умолчанию

Цитата:
Сообщение от StriderX Посмотреть сообщение
В этом и есть смысл TEncoding - для вас существует только string. Если строку надо куда-то отдать, то отдаёте вы байты, которые для вас построит TEncoding. Если вы хотите принять строку, то принимаете вы опять же набор байт, а string для вас из них построит TEncoding.
Embarcadero уже относительно давно форсит идею, что строковый тип должен быть строго один. Всё остальное - это legacy =-)
Тогда вечером гляну, если эта та штука, которая мне нужна
Должно быть имя? вне форума Ответить с цитированием
Старый 12.04.2015, 09:42   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
если я потом захочу через RTTI взаимодействовать на классы, то мне нужен будет функционал получения строки в разных типах
По-моему ты перегибнул палку... Мне думается что даже если и встанет так остро такая проблема, то во-первых ее решат быстро другими доступными средствами (Тот же TEncoding), а во-вторых вероятность ее будет низка.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.04.2015, 18:29   #17
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,770
По умолчанию

Цитата:
Сообщение от Должно быть имя? Посмотреть сообщение
Код:
  function ZvalStrPAChar(z:zval) : PAnsiChar; // НЕТУ поддержки UTF8

  function ZvalStrPWChar(z:zval) : PWideChar; // есть поддержка UTF8
Две эти функции невозможны, хоть десять TEncoding-ов используй. Для корректной выдачи значений типа PAnsiChar/PWideChar на вызывающей стороне нужно создавать буфер и передавать его в процедуру вместе с размером, чтобы не было уязвимости по переполнению буфера. Как функции API делают, короче.

В Delphi обычно с этим не заморачиваются, и если где-то нужен PAnsiChar или PWideChar, берут Pointer от значения AnsiString или UnicodeString/WideString. Обычно это для API требуется, а внутри Delphi-кода везде используются нормальные строки.
Vapaamies вне форума Ответить с цитированием
Старый 18.04.2015, 21:39   #18
Должно быть имя?
Пользователь
 
Регистрация: 11.04.2015
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Две эти функции невозможны, хоть десять TEncoding-ов используй. Для корректной выдачи значений типа PAnsiChar/PWideChar на вызывающей стороне нужно создавать буфер и передавать его в процедуру вместе с размером, чтобы не было уязвимости по переполнению буфера. Как функции API делают, короче.

В Delphi обычно с этим не заморачиваются, и если где-то нужен PAnsiChar или PWideChar, берут Pointer от значения AnsiString или UnicodeString/WideString. Обычно это для API требуется, а внутри Delphi-кода везде используются нормальные строки.
ZvalStrPWChar - работает как надо, с русскими буковками, и я внес кое какую правку тогда еще, а именно такую

Код:
function Utf8Str(Str:zval):RawByteString;
begin
  SetLength(Result, Str.value.str.len);
  Move(Str.value.str.val^, Result[1], Str.value.str.len);
  if DetectUTF8Encoding(Result) = etUTF8 then
    SetCodePage(Result, 65001, false);
end;

...
function ZvalStrPWChar;
begin
  Result := '';
  case z._type of
    IS_BOOL, IS_LONG   : Result := StringToOleStr(WideString(inttostr(z.value.lval)));
    IS_DOUBLE          : Result := StringToOleStr(WideString(FloatToStr(z.value.dval)));
    IS_STRING          : Result := StringToOleStr(WideString(Utf8Str(z)));
  end;
end;
Должно быть имя? вне форума Ответить с цитированием
Старый 19.04.2015, 06:30   #19
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,770
По умолчанию

Цитата:
Сообщение от Должно быть имя? Посмотреть сообщение
я внес кое какую правку тогда еще, а именно такую
Это быдлокод, приводящий к утечкам памяти.
Vapaamies вне форума Ответить с цитированием
Старый 21.04.2015, 23:40   #20
Должно быть имя?
Пользователь
 
Регистрация: 11.04.2015
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Это быдлокод, приводящий к утечкам памяти.
В смысле быдло код? ты имел введу эту функцию ?
Код:
function Utf8Str(Str:zval):RawByteString;
begin
  SetLength(Result, Str.value.str.len);
  Move(Str.value.str.val^, Result[1], Str.value.str.len);
  if DetectUTF8Encoding(Result) = etUTF8 then
    SetCodePage(Result, 65001, false);
end;
и где тут быдло код?если мне нужна получить русские буковки, а ваша Utf8ToAnsi работает криво, в плане если начальная строка не utf8
Должно быть имя? вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отобразить русские буквы. InkBlack Помощь студентам 2 29.09.2011 20:12
Русские буквы в case YourLastSong Общие вопросы C/C++ 2 05.05.2011 17:50
Русские буквы morgan97 Паскаль, Turbo Pascal, PascalABC.NET 4 10.03.2011 10:15
Не видно русские буквы. Go.away.noir SQL, базы данных 2 08.09.2009 12:16