C # ASCII GetBytes, как установить, какой символ используется для неузнаваемого преобразования? - PullRequest
3 голосов
/ 14 января 2011

Я портирую некоторый код с нативного C ++ на C #, и мне нужно сделать следующее:

ASCII.GetBytes когда он встречает символ Unicode, он не распознает, он возвращает мне символ с десятичным числом 63 (вопросительный знак), но в моем коде C ++, используя WideCharToMultiByte(CP_ACP, ..., когда он встречает символ, он не знает, что он использует символ с десятичным числом 37 (знак%).

У меня вопрос, как я могу заставить ASCII.GetBytes возвращать мне # 37 вместо # 63 для неизвестных символов?

Ответы [ 2 ]

6 голосов
/ 14 января 2011

В C # вы можете использовать DecoderFallback / EncoderFallback кодировки, чтобы решить, как она будет себя вести. Вы не можете изменить запасной вариант самого Encoding.ASCII, но вы можете клонировать его и затем установить запасной вариант. Вот пример:

using System;
using System.Text;

class Test
{    
    static void Main()
    {
        Encoding asciiClone = (Encoding) Encoding.ASCII.Clone();
        asciiClone.DecoderFallback = new DecoderReplacementFallback("%");
        asciiClone.EncoderFallback = new EncoderReplacementFallback("%");

        byte[] bytes = { 65, 200, 66 };
        string text = asciiClone.GetString(bytes);
        Console.WriteLine(text); // Prints A%B
        bytes = asciiClone.GetBytes("A\u00ffB");
        Console.WriteLine(bytes[1]); // Prints 37
    }
}
0 голосов
/ 14 января 2011

Предположительно, код C ++ вызывает WideCharToMultiByte с lpDefaultChar = "%".

Нет способа передать это в вызов Encoding.GetBytes, но вы можете вызвать WideCharToMultiByte с помощью P / Invoke.

...