我有一个字符串如下
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#中将其转换为可读的字符串?
答案 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”)。