В чем разница между WideChar и AnsiChar? - PullRequest
9 голосов
/ 09 февраля 2011

Я обновляю некоторый древний (с 2003 года) код Delphi до Delphi Architect XE, и у меня возникают некоторые проблемы.Я получаю ряд ошибок, когда есть несовместимые типы.Эти ошибки не происходят в Delphi 6, поэтому я должен предположить, что это потому, что вещи были обновлены.

Честно говоря, я не знаю, в чем разница между PAnsiChar и PWideChar, но Delphi точно знает разницу и не даст мне скомпилировать.Если бы я знал, в чем заключаются различия, возможно, я мог бы выяснить, что использовать или как это исправить.

Ответы [ 2 ]

19 голосов
/ 09 февраля 2011

Сокращение: до Delphi 2009. Нативный тип строки в Delphi имел обыкновение быть ANSI CHAR: каждый символ в каждой строке был представлен как 8-битный символ. Начиная с Delphi 2009 строки Delphi стали UNICODE с использованием нотации UTF-16: теперь базовый Char использует 16 бит данных (2 байта), и вам, вероятно, не нужно много знать о кодовых точках Unicode, которые представлены в виде двух последовательные 16-битные символы.

8-битные символы называются "анси-символы". PAnsiChar - это указатель на 8-битные символы. 16-битные символы называются «широкими символами». PWideChar - это указатель на 16-битные символы. Delphi знает разницу и преуспевает, если не позволяет смешивать их!

Подробнее

Вот популярная ссылка на Unicode: Абсолютный минимум, который должен знать каждый разработчик программного обеспечения Абсолютно, положительно, необходимо знать о Unicode и наборах символов

Более подробную информацию о переносе Delphi в Unicode вы можете найти здесь: Новый технический документ: Миграция Delphi в Unicode для простых смертных

Вы также можете выполнить поиск SO для «Миграция Delphi Unicode».

10 голосов
/ 09 февраля 2011

Пару лет назад тип символов по умолчанию в Delphi был изменен с AnsiChar (однобайтовая переменная, представляющая символ ANSI) на WideChar (двухбайтовая переменная, представляющая символ UTF16.) Тип char теперь псевдоним WideChar вместо AnsiChar, тип string теперь псевдоним UnicodeString (версия UTF-16 Unicode для традиционного строкового типа Delphi) вместо AnsiString и PChar тип теперь является псевдонимом PWideChar вместо PAnsiChar.

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

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

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

...