如何将包含Unicode字面字符的字符串转换为Unicode字符串

5

我通过 C# 代码从 API 接收到了数据,它们是以字面形式呈现的。其中一些数据中含有非 ASCII 字符,以下是一个示例:

string universityName = "Universidad de M\u00e1laga";

我将把这些数据插入到SQL Server数据库中,并希望插入Unicode编码版本,而非字面版本。为此,在插入之前需要正确地对字符串进行编码。它应该看起来像:

Universidad de Málaga

我在 Stack Overflow 上找了一圈,似乎没有相关的问题,所以想问一下。是否有内置的 C# 库可以让我提供原始字符串并返回所需的字符串?如果没有,我该遵循什么流程呢?

我已经尝试使用 Encoding.Unicode.GetBytes 获取字符串的字节,然后将其转换回字符串,但似乎对我无效。我也可能使用不正确。


你所说的API是指通过HTTP吗?如果是这样,请[编辑]您的问题以包括HTTP响应头Content-Type值。当您期望的不是文本时,将正文放入文本数据类型是否有特定原因?请展示相关代码。 - Tom Blodget
你的当前代码中,数据库中的字符串是什么样子?请展示你尝试过但未能正确运行的代码(并描述它为何不能正常工作)。 - Rufus L
您的原始字符串在调试器中显示为“Universidad de Málaga”,因此看起来是正确的。您的列是 VARCHAR 还是 NVARCHAR 类型?我不确定问题确切出现在哪里(它是否被存储不正确?如果是这样,在数据库中它是什么样子?)。 - Rufus L
1
如果你正在调用返回JSON的REST-like API,那么你应该了解它并可能使用一些流行的库,这样你就可以完全处理可能返回的所有内容,而不仅仅是这一个示例值。 - Tom Blodget
2个回答

4

有多种方法可以做到这一点,但这可能对您有用。

免责声明:假定您的字符串在数据库中看起来像这样:Universidad de M\u00e1laga

var test1 = "Universidad de M\\u00e1laga";  
var test2 = Regex.Unescape(test1);
Console.WriteLine(test1);
Console.WriteLine(test2);

输出

Universidad de M\u00e1laga
Universidad de Málaga
注意:这可能指向整个情况存在结构或设计问题。尽管,谁知道API会给你什么回应。 完整演示在此

为什么要使用 Regex.Unescape?这个字符串是一个正则表达式吗?虽然它似乎在这个特定的字符串上工作,但我认为它并不是一个真正健壮的解决方案。 - tukaef
当我尝试在我的字符串上执行这个操作(vsq\u0005),我得到的输出是"vsq\u0005"。我做错了什么?这两个都会得到相同的输出。 var t1 = Regex.Unescape("vsq\u0005"); var t2 = Regex.Unescape("vsq\u0005"); - undefined

0
你显示的字符串包含一个Unicode字符转义序列,这是一种在C#字符串中编码字符的方式,主要用于非可打印字符,但可以用于任何字符。例如,下面的所有字符串都是相等的:
"ab"
"\u0061b"
"a\u0062"
"\u0061\u0062"

你可以这样确认:

Console.WriteLine("ab" == "\u0061b"); // True
Console.WriteLine("ab" == "a\u0062"); // True
Console.WriteLine("ab" == "\u0061\u0062"); // True

在你的情况下:
Console.WriteLine("M\u00e1laga" == "Málaga"); // True

长话短说,你不需要做任何事情。你的字符串非常好。只需将其存储在数据库中即可!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接