что такое кодировка строки из функции Marshal.PtrToStringAnsi?
Нет единой кодировки "ANSI". Это текущая кодовая страница вашей системы. Это будет зависеть от настроек локали пользователя. Это должно соответствовать CharSet
enum :
Ansi : маршальные строки в виде многобайтовых символьных строк: системный код Windows (ANSI) по умолчаниюстраница в Windows и UTF-8 в Unix.
Обратите внимание на специальную обработку в Unix (и, я полагаю, в Linux).
Есть ли прощеспособ проверить, является ли строка из этой функции?
Мне кажется, что это совершенно другой вопрос, нежели основной. В частности: знание того, какую кодировку будет использовать функция при преобразовании из «ANSI» в UTF-16 (внутренняя кодировка текста, используемая в .NET), не дает мне способа «проверить, является ли строкаиз этой функции ". Если у вас есть объект C # string
, он уже закодирован как UTF-16. Это могло произойти из практически любой кодировки.
Из вашего вопроса также неясно, что вы подразумеваете под "работает, за исключением случаев, когда строка C # из Marshal.PtrToStringAnsi
function" . То есть каким образом точно не работает в этом сценарии? Похоже, ваш маршалер отвечает только за передачу байтов UTF-8 в нативный код или из него. Учитывая объект C # string
, никогда не должно иметь значения, как был создан string
. Теперь это строка символов UTF-16, которую можно надежно перекодировать как UTF-8. Если есть проблема с текстом «ANSI», эта проблема возникла до того, как ваш маршалер вмешался. Ваш маршалер не должен беспокоиться об этом.
Наконец: почему бы просто не использовать Encoding.UTF8
вместо создания нового объекта UTF8Encoding
при каждой операции маршалинга? По крайней мере, вы должны кэшировать объект, но так как GetBytes()
и GetString()
работают одинаково для любого экземпляра UTF8Encoding
, на самом деле вы должны просто использовать тот, который .NET уже создал для вас, и позволить.NET занимается кэшированием объекта.