Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.03.21;
Скачать: CL | DM;

Вниз

Можно ли 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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.011 c
2-1263392044
Виталий Панасенко
2010-01-13 17:14
2010.03.21
АДО и master-detail


6-1214365922
brother
2008-06-25 07:52
2010.03.21
TWebBrowser


2-1263804946
Олег1963
2010-01-18 11:55
2010.03.21
RandomRange не компилируется в модуле


15-1262449871
NailMan
2010-01-02 19:31
2010.03.21
Как сделать залипающий курсор мышки у края десктопа


1-1240936541
Igor2010
2009-04-28 20:35
2010.03.21
JavaScript+IHTMLWindows2