C# 我应该如何解码UTF-8字符串

C# 我应该如何解码UTF-8字符串,c#,string,utf-8,C#,String,Utf 8,我有一个字符串,比如: About\xee\x80\x80John F Kennedy\xee\x80\x81\xe2\x80\x99s暗杀案。45年后未解之谜\xe2\x80\x93。在过去的十年里,很多人都在猜测阴谋论。。。 我知道\xe2\x80\x93是破折号字符。但是我应该如何在C#中解码上面的字符串呢?如果你有这样一个字符串,那么你在解码它的时候使用了错误的编码。不存在“UTF-8字符串”,文本编码为二进制数据(字节)时,UTF-8数据为空。当它被解码成字符串时,就不再是UTF-8

我有一个字符串,比如:

About\xee\x80\x80John F Kennedy\xee\x80\x81\xe2\x80\x99s暗杀案。45年后未解之谜\xe2\x80\x93。在过去的十年里,很多人都在猜测阴谋论。。。

我知道
\xe2\x80\x93
是破折号字符。但是我应该如何在C#中解码上面的字符串呢?

如果你有这样一个字符串,那么你在解码它的时候使用了错误的编码。不存在“UTF-8字符串”,文本编码为二进制数据(字节)时,UTF-8数据为空。当它被解码成字符串时,就不再是UTF-8了

从二进制数据创建字符串时,应该使用UTF-8编码,一旦使用错误的编码创建字符串,就无法可靠地修复它

如果没有其他选择,您可以尝试通过使用创建字符串时使用的相同错误编码对字符串进行再次编码,然后使用相应的编码对其进行解码来修复该字符串。但是,不能保证这对所有字符串都有效,一些字符在错误的解码过程中会丢失。例如:

// wrong use of encoding, to try to fix wrong decoding
str = Encoding.UTF8.GetString(Encoding.Default.GetBytes(str));

逐个字符扫描输入字符串,并使用
UTF8解码器将以
\x
开头的值转换为
string
string
byte[]
,然后返回到
string
),保持所有其他字符不变:

static string Decode(string input)
{
    var sb = new StringBuilder();
    int position = 0;
    var bytes = new List<byte>();
    while(position < input.Length)
    {
        char c = input[position++];
        if(c == '\\')
        {
            if(position < input.Length)
            {
                c = input[position++];
                if(c == 'x' && position <= input.Length - 2)
                {
                    var b = Convert.ToByte(input.Substring(position, 2), 16);
                    position += 2;
                    bytes.Add(b);
                }
                else
                {
                    AppendBytes(sb, bytes);
                    sb.Append('\\');
                    sb.Append(c);
                }
                continue;
            }
        }
        AppendBytes(sb, bytes);
        sb.Append(c);
    }
    AppendBytes(sb, bytes);
    return sb.ToString();
}

private static void AppendBytes(StringBuilder sb, List<byte> bytes)
{
    if(bytes.Count != 0)
    {
        var str = System.Text.Encoding.UTF8.GetString(bytes.ToArray());
        sb.Append(str);
        bytes.Clear();
    }
}

最后我用了这样的方法:

public static string UnescapeHex(string data)
{
    return Encoding.UTF8.GetString(Array.ConvertAll(Regex.Unescape(data).ToCharArray(), c => (byte) c));
}

您是如何将数据输入字符串的?所有的C#字符串输入机制(我可以想到)都允许您指定编码。您的输入数据是双重编码的吗?@Rup:数据作为输入提供给我。所以我无法在输入端解决这个问题。@derekhh我们知道它是提供给您的,但是从何处/什么/谁那里?您在哪里看到这些
\x**
序列?在调试器中?请不要在问题标题中包含有关所用语言的信息,除非没有它就没有意义。标签就是为了这个目的。
public static string UnescapeHex(string data)
{
    return Encoding.UTF8.GetString(Array.ConvertAll(Regex.Unescape(data).ToCharArray(), c => (byte) c));
}