В чем разница между WideChar и AnsiChar?
Я обновляю некоторый древний (с 2003) код Delphi до Delphi Architect XE, и у меня возникает несколько проблем. Я получаю ряд ошибок, где есть несовместимые типы. Эти ошибки не происходят в Delphi 6, поэтому я должен предположить, что это связано с обновлением.
Я честно не знаю, в чем разница между PAnsiChar и PWideChar, но Delphi точно знает разницу и не позволит мне компилировать. Если бы я знал, в чем разница может быть Я мог бы выяснить, что использовать или как это исправить.
2 ответов
кратко: до Delphi 2009 собственный строковый тип в Delphi использовался как ANSI CHAR: каждый символ в каждой строке был представлен как 8-битный char. Начиная с Delphi 2009 строки Delphi стали UNICODE, используя нотацию UTF-16: теперь основной символ использует 16 бит данных (2 байта), и вам, вероятно, не нужно много знать о кодовых точках Unicode, которые представлены в виде двух последовательных 16-битных символов.
8-битные символы называются "ANSI Chars". - PAnsiChar-указатель на 8-битные символы. 16-битные символы называются "широкими символами". PWideChar-это указатель на 16-битные символы. Delphi знает разницу и делает хорошо, если это не позволяет вам смешивать два!
Подробнее
вот популярная ссылка на Unicode:абсолютный минимум каждый разработчик программного обеспечения абсолютно, положительно должен знать о Unicode и наборах символов
вы можете найти дополнительную информацию о миграции Delphi в Unicode здесь:новая белая книга: миграция Юникода Delphi для простых смертных
вы также можете искать "Delphi Unicode migration".
пару лет назад тип символов по умолчанию в Delphi был изменен с AnsiChar
(однобайтовая переменная, представляющая символ ANSI) в WideChar
(двухбайтовая переменная, представляющая символ UTF16.) The char
type теперь является псевдонимом WideChar
вместо AnsiChar
, the string
type теперь псевдоним для UnicodeString
(версия Юникода UTF-16 традиционного строкового типа Delphi) вместо AnsiString
и PChar
type теперь псевдоним для PWideChar
вместо PAnsiChar
.
компилятор может позаботиться о многих преобразованиях сам, но есть несколько проблем:
- если вы используете типы строковых указателей, такие как
PChar
, вам необходимо убедиться, что ваш указатель указывает на правильный тип данных, и компилятор не сможет проверить это. - если вы передаете строки в var параметры, тип переменной должен быть точно таким же. Это может быть сложнее теперь, когда ты ... нужно разобраться с двумя типами струн.
- если вы используете
string
в качестве удобного буфера байтового массива для хранения произвольных данных вместо переменной, содержащей текст, которая не будет работать какUnicodeString
. Убедитесь, что они объявлены какRawByteString
как временное решение. - в любом месте, где вы имеете дело с длиной строковых байтов, например, при чтении или записи в/из TStream, убедитесь, что ваш код не предполагает, что
char
- это один байт.
принять посмотреть миграция Юникода Delphi для простых смертных еще несколько трюков и советов о том, как заставить это работать. Это не так сложно, как кажется, но и не тривиально. Удачи!