将UTF-8文字转换为可读字符串,C#?

时间:2019-07-01 10:28:57

标签: c# string encoding utf-8

我有一个字符串如下

const string nameString = @"\xda\xa9\xd8\xa7\xd8\xb1\xd8\xa8\xd8\xb1";

我尝试过:

var name = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(nameString));

不行。

您可以在此处找到真实的角色:
https://utf8-chartable.de/unicode-utf8-table.pl?start=1536&number=128&names=-&utf8=string-literal
例如: U+0631 ر \xd8\xb1

如何在C#中将其转换为可读的字符串?

2 个答案:

答案 0 :(得分:2)

好吧,我们必须解析:每个"\xa9"应该转换为byte 0xa9

  const string nameString = @"\xda\xa9\xd8\xa7\xd8\xb1\xd8\xa8\xd8\xb1";

我们可以借助正则表达式

  byte[] data = Regex
    .Matches(nameString, @"\\x(?<value>[0-9a-fA-F]{1,2})")
    .Cast<Match>()
    .Select(match => (Convert.ToByte(match.Groups["value"].Value, 16)))
    .ToArray();

让我们看一下数据:

  // da a9 d8 a7 d8 b1 d8 a8 d8 b1
  Console.WriteLine(string.Join(" ", data.Select(b => b.ToString("x2"))));     

最后,我们想将data编码为字符串;假设我们应该使用UTF8

  string name = Encoding.UTF8.GetString(data);

  Console.WriteLine(name);

结果:

  کاربر

答案 1 :(得分:1)

使用@符号会使转义序列按字面意义进行解释。删除@符号以达到预期的效果。

有关更多信息,请参见@ (C# Reference)

  

此例中的@字符定义了逐字字符串文字。从字面上解释简单的转义序列(例如,反斜杠为“ \”),十六进制转义序列(例如,大写为A的“ \ x0041”)和Unicode转义序列(例如大写的A为“ \ u0041”)。