我应该如何解码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编码,一旦使用错误的编码创建字符串,你就无法可靠地修复它
如果没有其他选择,您可以尝试修复字符串,方法是使用创建字符串时使用的错误编码再次对其进行编码,然后使用相应的编码对其进行解码。然而,不能保证这对所有字符串都有效,有些字符在错误解码过程中会丢失。示例:
// wrong use of encoding, to try to fix wrong decoding
str = Encoding.UTF8.GetString(Encoding.Default.GetBytes(str));
逐字符扫描输入字符串,并将以'x
开头的值(使用UTF8 decoder
将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();
}
}
输出:
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));
}