A couple years ago, the default character type in Delphi was changed from AnsiChar
(single-byte variable representing an ANSI character) to WideChar
(two-byte variable representing a UTF16 character.) The char
type is now an alias to WideChar
instead of AnsiChar
, the string
type is now an alias to UnicodeString
(a UTF-16 Unicode version of Delphi's traditional string type) instead of AnsiString
, and the PChar
type is now an alias to PWideChar
instead of PAnsiChar
.
The compiler can take care of a lot of the conversions itself, but there are a few issues:
- If you're using string-pointer types, such as
PChar
, you need to make sure your pointer is pointing to the right type of data, and the compiler can't always verify this.
- If you're passing strings to var parameters, the variable type needs to be exactly the same. This can be more complicated now that you've got two string types to deal with.
- If you're using
string
as a convenient byte-array buffer for holding arbitrary data instead of a variable that holds text, that won't work as a UnicodeString
. Make sure those are declared as RawByteString
as a workaround.
- Anyplace you're dealing with string byte lengths, for example when reading or writing to/from a TStream, make sure your code isn't assuming that a
char
is one byte long.
Take a look at Delphi Unicode Migration for Mere Mortals for some more tricks and advice on how to get this to work. It's not as hard as it sounds, but it's not trivial either. Good luck!
String
andChar
, then everything should map correctly to the right string type... – Jørn E. Angeltveit