Форум: "Основная";
Текущий архив: 2010.03.21;
Скачать: [xml.tar.bz2];
ВнизМожно ли WideString спокойно использовать вместо String? Найти похожие ветки
← →
SPeller © (2009-02-16 13:04) [0]Дело в том, что написал себе небольшую обёртку над libxml, сначала везде использовал string. Но потом понадобилась поддержка юникода в классах и utf-8 в xml и я просто взял и заменил все декларации со string на WideString, добавив где надо utf8encode/decode. Работать работает, но тут наткнулся в хелпе на то, что string имеет встроенный счетчик ссылок, а WideString - нет. И вообще, местами говорят, что WideString это больше для COM, нежели для поддержки юникода в программе. А поскольку в этом аспекте я не сильно компетентен, то закрались сомнения - использование этих двух типов чем-нибудь различно? Не надо ли делать дополнительных телодвижений чтобы небыло каких-нибудь утечек?
← →
Медвежонок Пятачок © (2009-02-16 13:48) [1]для utf-8 widestring вообще не нужен
← →
SPeller © (2009-02-17 00:49) [2]читай внимательней. юникод в классах
← →
Медвежонок Пятачок © (2009-02-17 14:04) [3]а я что-то про классы сказал?
← →
SPeller © (2009-02-17 15:48) [4]не можешь написать по существу - молчи лучше
← →
Сергей М. © (2009-02-17 16:11) [5]
> WideString это больше для COM, нежели для поддержки юникода
> в программе
И для того и для другого.
Основное отличие - память под собственно строку распределяется/перераспределяется/освобождается менеджером в составе oleauto32.dll
> string имеет встроенный счетчик ссылок, а WideString - нет
WideString тоже имеет.
← →
Jack128_ (2009-02-17 16:36) [6]
>
> > string имеет встроенный счетчик ссылок, а WideString -
> нет
>
>
> WideString тоже имеет.
ну видимо он какой то странный счетчик..procedure TForm1.FormCreate(Sender: TObject);
var
W1, W2: WideString;
S1, S2: AnsiString;
begin
W1 := StringOfChar(" " , 10);
S1 := W1;
S2 := S1;
W2 := W1;
Caption := Format("Wide pointers equality = %s, Ansi equality = %s", [
BoolToStr(Pointer(W1) = Pointer(W2), True), // False
BoolToStr(Pointer(S1) = Pointer(S2), True)]); // True
end;
← →
Сергей М. © (2009-02-17 16:53) [7]
> Jack128_
Сч-к в дан.случае контролируется не компилятором, а oleauto32
← →
Jack128_ (2009-02-17 17:08) [8]
>
> Сч-к в дан.случае контролируется не компилятором, а oleauto32
я понимаю. Но и присвоение вайдстрингов тоже контролируется олешным MemoryManager"ом. W2 := W1 фактически сводится к вызову SysReAllocStringLen. Если бы у Widestring"ов был счетчик ссылок, то SysReAllocStringLen можно было бы реализовать гараздо эффективнее для частного случая присвоения одной строки другой. Как это в делфийском компилере сделано..
← →
SPeller © (2009-02-18 02:19) [9]Могу ли я спокойно пользоваться WideString так же как и string? Или таки нужно знать и учитывать нюансы? Какова скорость работы менеджера oleaut32 по сравнению с дельфийским менеджером?
← →
KSergey © (2009-02-18 07:29) [10]> SPeller © (18.02.09 02:19) [9]
> Могу ли я спокойно пользоваться WideString так же как и string?
Да. Все даже еще круче: их можно принимать/возвращать/модифицировать(!) в функциях dll, собранных без общего менеджера памяти!
← →
Сергей М. © (2009-02-18 08:13) [11]
> Какова скорость работы менеджера oleaut32 по сравнению с
> дельфийским менеджером?
Думаю что при прочих равных условиях, характерных именно для дельфийского приложения, он уступает по производительности BMM и FastMem.
← →
SPeller © (2009-02-18 12:47) [12]
> KSergey © (18.02.09 07:29) [10]
> Да. Все даже еще круче: их можно принимать/возвращать/модифицировать(!
> ) в функциях dll, собранных без общего менеджера памяти!
Это я вкурсе, что этот тип совместим с BSTR и можно его пользовать везде где угодно. Просто сомнения что эти строки при интенсивном использовании неизвестно когда и кем будут освобождены. Например, когда я передаю из msvс++ кода указатель на структуру BSTR, принимаю его у себя как PWideString, задаю ему значение, то присвоенное значение спокойно доступно в вызывающем коде. А кто и когда при этом освободит память, занимаемую этой строкой? Если вызывать из дельфийского кода, то смысл, думаю, не изменится. Кто освободит и когда?
> Сергей М. © (18.02.09 08:13) [11]
Значит, критичные к скорости операции не стоит связывать с юникодом.
← →
Сергей М. © (2009-02-18 12:51) [13]
> когда я передаю из msvс++ кода указатель на структуру BSTR,
> принимаю его у себя как PWideString
А надо бы как PWideChar
← →
Riply © (2009-02-18 16:57) [14][12] SPeller © (18.02.09 12:47)
> Значит, критичные к скорости операции не стоит связывать с юникодом.
IMHO, в "критичныч к скорости операциях", вообще не стоит использовать работу со строками.
← →
Сергей М. © (2009-02-18 17:03) [15]
> Riply © (18.02.09 16:57) [14]
А шо делать, если xml - это строки и ничто кроме строк ?)
← →
Riply © (2009-02-18 17:12) [16]> [15] Сергей М. © (18.02.09 17:03)
> А шо делать, если xml - это строки и ничто кроме строк ?)
"Не держись устава яко слепой стены" (с) коментарий Петра Первого к уставу, написанному им же :)
А если серьезно, то в данном случае, видимо, придется выбирать между
"критичностью к скорости" и способом хранения данных.
← →
SPeller © (2009-02-19 01:20) [17]
> Сергей М. © (18.02.09 12:51) [13]
> А надо бы как PWideChar
Дык, а почему работает если как указатель на строку использовать? По-моему, это то же самое, как объявить var WideString, что и делается в ком-объектах, создаваемых в дельфи.
> А если серьезно, то в данном случае, видимо, придется выбирать
> между
> "критичностью к скорости" и способом хранения данных.
Скорость пока не критична, это я на будущее чтобы знать. Да и вообще, тему эту создал чтобы прояснить не до конца понятные мне моменты.
← →
Riply © (2009-02-19 02:13) [18]> [17] SPeller © (19.02.09 01:20)
> Да и вообще, тему эту создал чтобы прояснить не до конца понятные мне моменты.
И правильно сделал.
Для меня, например, данная ветка была полезна.
← →
Сергей М. © (2009-02-19 08:31) [19]
> почему работает
Проиллюстрируй в коде ..
← →
Сергей М. © (2009-02-19 09:33) [20]
> SPeller © (19.02.09 01:20) [17]
Прочитай внимательно:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1357
← →
SPeller © (2009-02-19 12:15) [21]Прочитал. Вопрос: зачем вы мне советовали PWideChar вместо WideString - чтобы вручную заниматься вызовами SysXXString?
← →
SPeller © (2009-02-19 12:15) [22]Прочитал. Вопрос: зачем вы мне советовали PWideChar вместо WideString - чтобы вручную заниматься вызовами SysXXString?
← →
Сергей М. © (2009-02-19 12:25) [23]А зачем закрыв глаза отдавать это на откуп компилятору, если каждая секунда дорога и работа с автоматически создаваемой/уничтожаемой копией возможно и не требуется ?
Т.е я не против WideString, но, imho, он уместен только там где он действительно уместен)
← →
SPeller © (2009-02-19 14:09) [24]Ну хорошо. А счетчик ссылок, точнее его отсутствие, в каких моментах проявляется?
← →
Anatoly Podgoretsky © (2009-02-19 15:02) [25]> SPeller (19.02.2009 12:15:21) [21]
Скажи для чего и где ты используешь WideString, а я тебе скажу что правильнее, по крайней мере на мой взляд.
← →
Anatoly Podgoretsky © (2009-02-19 15:04) [26]> SPeller (19.02.2009 14:09:24) [24]
При отсутствие ты должен сам решать, когда удалять.
← →
SPeller © (2009-02-20 01:55) [27]
> Скажи для чего и где ты используешь WideString
Я же в сабже написал. Класс дла работы с xml. Сейчас задача маленькая, но сделано с рассчетом на будущее, чтобы можно было работать с utf-8 xml без запарки с перекодировками, хоть с китайским языком.
← →
Pavia © (2009-02-20 07:55) [28]А как в дельфи 7 грамотно работать с юникодом? А то SizeOf(WideChar)=2 а юникодовый символ 4 милиона, нужно ведь 4 байта!!!!
← →
Anatoly Podgoretsky © (2009-02-20 12:29) [29]На самом деле есть два Юникода UCS-2 и UCS-4
И с ними странные вещи творятся, то сначала одни смеются, мол в Микрософте дураки работают, но когда МС переходит на UCS-2, то Юникод корсоциум переходит на UCS-4 и опять смеется, мол в Микрософте дураки работают.
← →
Anatoly Podgoretsky © (2009-02-20 12:31) [30]Я использую WideString в Д7 почти везде, в совокупности с TNT Unicode Controls.
← →
Anatoly Podgoretsky © (2009-02-20 12:34) [31]Ой в Д2006, поскольку Д7 очень опасен.
Опасность только с литералами.
Ответ на [21][27] тебе PWideChar не нужен.
← →
SPeller © (2009-02-20 12:40) [32]а нафига ucs-4, в 65 тысяч символов всё не вместили, нужно 4 миллиона? с запасом на иноземные языки чтоли? или древних майя с древнекорейским туда включили?
← →
Anatoly Podgoretsky © (2009-02-20 13:34) [33]> SPeller (20.02.2009 12:40:32) [32]
Именно так 65000 недостаточно, что бы все вместить, не забудь про иероглицы, только китайцам и японцам надо больше.
И насчет майя и прочей экзотики, они тоже имеют право на жизнь. Кроме букв и иероглифов алфавит поддерживает и пиктограммы.
← →
Pavia © (2009-02-21 03:31) [34]
> или древних майя с древнекорейским туда включили?
Да древнии языки включили.
Так как я так и не услышал то что желал. Задам более развернута вопрос.
Как в дельфи корректно работать с юникодом?
Как выделить из строки символ? Как узнать число символов? Как правильно сравнивать строки? Что нибудь стандарт говорит про похожи символы "е" и "ё" ? В русском только два, а в китайском их много.
Может есть еще что-то что нужно знать?
← →
Pavia © (2009-02-21 03:31) [35]
> или древних майя с древнекорейским туда включили?
Да древнии языки включили.
Так как я так и не услышал то что желал. Задам более развернута вопрос.
Как в дельфи корректно работать с юникодом?
Как выделить из строки символ? Как узнать число символов? Как правильно сравнивать строки? Что нибудь стандарт говорит про похожи символы "е" и "ё" ? В русском только два, а в китайском их много.
Может есть еще что-то что нужно знать?
← →
имя (2009-05-01 18:18) [36]Удалено модератором
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2010.03.21;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.006 c