В чем разница между 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.

компилятор может позаботиться о многих преобразованиях сам, но есть несколько проблем:

  1. если вы используете типы строковых указателей, такие как PChar, вам необходимо убедиться, что ваш указатель указывает на правильный тип данных, и компилятор не сможет проверить это.
  2. если вы передаете строки в var параметры, тип переменной должен быть точно таким же. Это может быть сложнее теперь, когда ты ... нужно разобраться с двумя типами струн.
  3. если вы используете string в качестве удобного буфера байтового массива для хранения произвольных данных вместо переменной, содержащей текст, которая не будет работать как UnicodeString. Убедитесь, что они объявлены как RawByteString как временное решение.
  4. в любом месте, где вы имеете дело с длиной строковых байтов, например, при чтении или записи в/из TStream, убедитесь, что ваш код не предполагает, что char - это один байт.

принять посмотреть миграция Юникода Delphi для простых смертных еще несколько трюков и советов о том, как заставить это работать. Это не так сложно, как кажется, но и не тривиально. Удачи!