Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1263955273
Soi
2010-01-20 05:41
2010.03.21
Вставка записей в БД циклом


1-1242287326
SPeller
2009-05-14 11:48
2010.03.21
А можно ли в дельфи импортировать функции, написанные на C++?


1-1240570370
MultIfleX
2009-04-24 14:52
2010.03.21
Адрес вызывающего функцию


15-1262522391
И. Павел
2010-01-03 15:39
2010.03.21
PHP - не хватает прав для выполнения fopen


11-1214116630
Trejder
2008-06-22 10:37
2010.03.21
Delphi + KOL = WinCE?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский