如何在字符串中解码Unicode字符

37

我该如何在C#中解码字符串 'Sch\u00f6nen' (@"Sch\u00f6nen")? 我已尝试使用HttpUtility,但它没有给我需要的结果,即 "Schönen"。


你看过System.Text.Encoding类吗?你可以尝试使用UTF-8编码来解码Unicode字符串内容。UTF-8 - Trevor Pilley
3个回答

84

Regex.Unescape解决了这个问题:

System.Text.RegularExpressions.Regex.Unescape(@"Sch\u00f6nen");

请注意,在测试变量或编写单元测试时需要小心:"Sch\u00f6nen" 已经是 "Schönen"。您需要在字符串前面加上@以将\u00f6视为字符串的一部分。


我知道这条评论有点旧了,但是你的评论关于在Unicode之前添加@已经解决了我的问题。非常感谢你。 - Bubbles

4
如果您看到字符串常量中的“Schönen”(或类似的\ uXXXX值),并因此而来到这个问题 - 这不是编码。这是一种表示Unicode字符的转义序列,类似于字符串通过\n表示换行和\r表示回车。
我认为您不需要解码。
string unicodestring = "Sch\u00f6nen";
Console.WriteLine(unicodestring);

输出了 Schönen。


当我在Windows手机模拟器上输出时,它显示为“Sch\u00f6nen”,因此需要进行转义。回答了我的问题然后删除了他的帖子的用户得到了正确的答案,我不知道他为什么要删除它。 - M_K
2
我认为你们两个误解了彼此 :) @findcaiyzh,如果您使用string unicodestring = "Sch\\u00f6nen";更新您的示例,您将得到@M_K所说的情况。当从远程端点检索JSON结果时,这种情况很常见。 - Mladen B.

0
写了一个将Unicode字符串转换为实际字符的代码。(但是这个主题中最好的答案效果很好,而且更简单)。
string stringWithUnicodeSymbols = @"{""id"": 10440119, ""photo"": 10945418, ""first_name"": ""\u0415\u0432\u0433\u0435\u043d\u0438\u0439""}";
var splitted = Regex.Split(stringWithUnicodeSymbols, @"\\u([a-fA-F\d]{4})");
string outString = "";
foreach (var s in splitted)
{
    try
    {
        if (s.Length == 4)
        {
            var decoded = ((char) Convert.ToUInt16(s, 16)).ToString();
            outString += decoded;
        }
        else
        {
            outString += s;
        }
    }
    catch (Exception e)
    {
        outString += s;
    }
}

通过length == 4的检查,几乎可以确定对于一些像\uAAAAAAA\uAAAA这样在Unicode字符之间有长度为4的字符串的情况,结果可能是错误的。但核心转换已经足够好,可以编写一个解析器。 - Cory-G

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