【问题标题】:Convert UTF-8 literals to readable string, C#?将 UTF-8 文字转换为可读字符串,C#?
【发布时间】:2019-11-12 00:21:28
【问题描述】:

我有一个字符串如下

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# 中将其转换为可读的字符串?

【问题讨论】:

  • 您希望返回什么字符串?我不清楚您是否真的期望 bytes 0xDA、0xA9、0xD8、0xA7 等的 UTF-8 解码...因为如果是这样,如果您可以可能nameString 改为字节数组,这样会好很多。
  • 否则,您需要在 second Encoding 调用中使用Encoding.GetEncoding(28591),以便您可以将字符串视为ISO-8859-1 ...但从根本上说您正在使用字符串来表示任意二进制数据,这不是一个好主意。如果你能提供更多的上下文,那真的很有帮助。 (作为提示,“不工作”几乎从不很好地描述了故障模式。告诉我们您期望发生的事情与实际发生的事情。)
  • @JonSkeet 请再看一遍帖子,我编辑了。
  • 哎呀 - 我没有发现它是一个逐字字符串文字开始。哇!
  • 你应该明白这是一个 NOP Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(nameString))。它们是完全相反的(除非通过null)。

标签: c# string encoding utf-8


【解决方案1】:

好吧,我们要解析:每个"\xa9"都应该转换成byte0xa9

  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);

结果:

  کاربر

【讨论】:

  • 太好了,谢谢 ;-)
【解决方案2】:

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

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

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

【讨论】:

  • 没有变化,我用const string nameString = "\xda\xa9\xd8\xa7\xd8\xb1\xd8\xa8\xd8\xb1"; var name = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(nameString)); Console.WriteLine(name);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 2014-02-05
  • 2013-03-02
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多