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

本文关键字:UTF-8 字符串 解码 何解码 我应该 | 更新日期: 2023-09-27 17:50:52

我有一个字符串,比如:

About 'xee'x80'x80John F Kennedy'xee'x80'x81'xe2'x80'x99s Assassination . unsolved mystery 'xe2'x80'x93 45 years later. Over the last decade, a lot of individuals have speculated on conspiracy theories that ...

我知道'xe2'x80'x93是一个短划线字符。但是我应该如何在C#中解码上面的字符串呢?

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

如果您有这样的字符串,那么在最初解码时使用了错误的编码。没有"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));

逐字符扫描输入字符串,并将以'x开头的值(使用UTF8 decoderstring转换为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();
    }
}

输出:

About John F Kennedy’s Assassination . unsolved mystery – 45 years later. Over the last decade, a lot of individuals have speculated on conspiracy theories that ...

最后我使用了这样的东西:

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