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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2016, 18:40   #1
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию UnicodeString

В Delphi2009 и старше тип String теперь определён не как AnsiString, а как UnicodeString. Соответственно, PString = ^UnicodeString.
А вот как дела обстоят с Char? Char = WideChar, PChar = ^WideChar? Или как-то по-другому?

Почему если Char = WideChar, то String = Unicode, а не WideString?
И в чём принципиальная разница между этими типами строк?
Ведь это не одно и то же, потому как:
Код:
procedure SS(var X: WideString);
. . .
procedure CC(var X: WideChar);
. . .
var
  S: String;  // WideString
  C: Char;  // WideChar

begin
  SS(S);  // Types of actual and formal var parameters must be identical
  CC(C);  // А тут всё ok
  C := S[1]  // И тут всё ok
end.
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 28.09.2016, 18:57   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
И в чём принципиальная разница между этими типами строк?
в том же в чем разница между Unicode и Ansi.
Цитата:
Почему если Char = WideChar, то String = Unicode, а не WideString?
WideChar тип уже давно есть.
+ UnicodeString потому что тип WideString тоже давно был(но он не тоже самое)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.09.2016, 19:04   #3
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Между Unicode и ANSI разница как минимум в размерности: 2 байта и 1.
А вот UnicodeString и WideString обе двухбайтовые. В чём между ними-то разница?

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
WideChar тип уже давно есть.
+ UnicodeString потому что тип WideString тоже давно был(но он не тоже самое)
Ну так, почему же тогда UnicodeString появился, а UnicodeChar нет?
И почему UnicodeString[1] - это WideChar, если UnicodeString и WideString - это разные вещи?
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 28.09.2016, 19:07   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

WideString это BSTR из COM-мира винды.
соотственно он имеет фиксированную реализацию.

UnicodeString это их уж, он имеет их реализацию, но имя уже есть.
ну а WideChar уже давно есть, и это вполне себе тупой тип, смысл делать еще один псевдоним?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.09.2016, 19:08   #5
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Char = WideChar, PChar = ^WideChar? Или как-то по-другому?
Да так.

Цитата:
Почему если Char = WideChar, то String = Unicode, а не WideString?
http://docwiki.embarcadero.com/RADSt..._Types_(Delphi)
Я не знаток COM. Я так понимаю что WideString управляет COM объект. А Unicode - строкой дельфи. В Unicode есть подсчёт ссылок при копировании такой строки увеличивается счётчик ссылок. А для WideString целиком копируется строка так как COM объекты могут работать даже на разных компьютерах.
Тем самым Unicode - более эффективна.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 28.09.2016, 19:09   #6
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Я даже больше скажу: например, MessageBoxW принимает параметры типа LPCWSTR, который описан (в Winapi.Windows.pas) как LPCWSTR = PWideChar.
Не надо быть экстрасенсом, чтобы понять, что W в данном случае означает Wide.
Хотя в MSDN написано:
Цитата:
Unicode and ANSI names: MessageBoxW (Unicode) and MessageBoxA (ANSI)
Получается, что Unicode и Wide - это одно и то же. Почему же тогда Delphi разделил эти строки? Причём, сделал их несовместимыми для var-параметров.
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 28.09.2016, 19:10   #7
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Я не знаток COM. Я так понимаю что WideString управляет COM объект. А Unicode - строкой дельфи. В Unicode есть подсчёт ссылок при копировании такой строки увеличивается счётчик ссылок. А для WideString целиком копируется строка так как COM объекты могут работать даже на разных компьютерах.
Тем самым Unicode - более эффективна.
Хм, интересно...
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 28.09.2016, 19:14   #8
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
WideString это BSTR из COM-мира винды.
соотственно он имеет фиксированную реализацию.
Это второе отличие Unicode строка содержит поле с номером кодировке и может быть реализована вернее иметь внутреннее представление к примеру UTF-8 или UTF-16 или даже Win-1251.
Но нормально эту особенность использовать затруднительно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 28.09.2016, 19:17   #9
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

А вообще типа Unicode появился в 2009 (когда все String стали UnicodeString) или раньше?
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 28.09.2016, 19:18   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Это второе отличие Unicode строка содержит поле с номером кодировке и может быть реализована вернее иметь внутреннее представление к примеру UTF-8 или UTF-16 или даже Win-1251.
тут я уже пасс, не пишу на Делфях более 5 лет.
Цитата:
Получается, что Unicode и Wide - это одно и то же. Почему же тогда Delphi разделил эти строки? Причём, сделал их несовместимыми для var-параметров.
ну давайте не будет узнавать почему еще MS так функцию назвали.
да и в WinAPI оно означает тоже что символы широкие(Wide), но сама по себе функция юникодная(нет кодировки широкая)
Цитата:
А вообще типа Unicode появился в 2009 (когда все String стали UnicodeString) или раньше?
2009
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Из UnicodeString в char[] Lokki23 C++ Builder 3 21.01.2014 20:14
Сохранить в файл UnicodeString greenisius Общие вопросы C/C++ 6 08.12.2013 14:04
Строки UnicodeString и string greenisius C++ Builder 3 07.11.2012 11:31
Cannot convert 'int*' to 'UnicodeString' York C++ Builder 1 24.02.2012 10:48
UnicodeString - кодирование русских символов. Freeman C++ Builder 3 15.06.2011 03:32