我有一个字符串:
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#中的上述字符串?
答案 0 :(得分:7)
如果你有这样的字符串,那么你在第一次解码时就使用了错误的编码。没有" UTF-8字符串",UTF-8数据是将文本编码为二进制数据(字节)。当它被解码成字符串时,它不再是UTF-8。
从二进制数据创建字符串时应使用UTF-8编码,一旦使用错误的编码创建字符串,就无法可靠地修复它。
如果没有其他替代方法,您可以尝试通过使用与创建它相同的错误编码再次对其进行编码来修复字符串,然后使用corrent编码对其进行解码。但是不能保证这对所有字符串都有效,在错误的解码过程中会丢失一些字符。例如:
// wrong use of encoding, to try to fix wrong decoding
str = Encoding.UTF8.GetString(Encoding.Default.GetBytes(str));
答案 1 :(得分:3)
最后我使用了这样的东西:
public static string UnescapeHex(string data)
{
return Encoding.UTF8.GetString(Array.ConvertAll(Regex.Unescape(data).ToCharArray(), c => (byte) c));
}
答案 2 :(得分:2)
扫描输入字符串char-by-char并将值从\x
(string
开始转换为byte[]
并使用string
转换回UTF8 decoder
),保持所有其他角色不变:
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 ...