Кодировки и маршалинг
Способ маршалирования значений char
, объектов string
и объектов System.Text.StringBuilder
зависит от значения, заданного в поле CharSet
P/Invoke или структуры. Для P/Invoke можно указать CharSet
, задав в поле DllImportAttribute.CharSet при объявлении P/Invoke. Чтобы указать CharSet
для типа, задайте StructLayoutAttribute.CharSet в декларации класса или структуры. Если эти поля атрибута не заданы, используемое значение CharSet
определяется компилятором языка. C#, Visual Basic и F# используют None набор символов по умолчанию, который имеет то же поведение, что и набор символовAnsi.
Если модуль System.Runtime.InteropServices.DefaultCharSetAttribute применяется в коде C# или Visual Basic, компилятор C# или Visual Basic будет выдавать предоставленный CharSet
по умолчанию код вместо использованияCharSet.None
. F# не поддерживает DefaultCharSetAttribute
и всегда выдает CharSet.None
по умолчанию.
В следующей таблице показаны кодировки и способ представления символа или строки при маршалировании в этой кодировке.
ЗначениеCharSet |
Windows | .NET Core 2.2 и более ранние версии в Unix | .NET Core 3.0 и более поздние версии, Mono в Unix |
---|---|---|---|
Ansi |
char (системная кодовая страница Windows (ANSI) по умолчанию) |
char (UTF-8) |
char (UTF-8) |
Unicode |
wchar_t (UTF-16) |
char16_t (UTF-16) |
char16_t (UTF-16) |
Auto |
wchar_t (UTF-16) |
char16_t (UTF-16) |
char (UTF-8) |
Вы должны понимать, какое представление ожидает ваше собственное представление при выборе кодировки.