在 c# 中如何将 unicode 字符转换回 UTF-8?

In c# How to convert back unicoded characters to UTF-8?

我有此文本 Grou00dfbeerenstrau00dfe,我需要将其转换为 Großbeerenstraße 还有 Eichstu00e4ttEichstätt 但由于这些原因,我没有完全理解和解决这个问题:

  1. 只转换部分字符(特殊字符),而不是整个文本
  2. Unicoded 文本通常使用转义字符 \u00df 而不是 u00df

你能帮我正确转换回原来的状态吗? 基本上没有转义符怎么转换?

注意:如果您一定要知道,我正在向某个系统发送一些特殊字符串。我无法触及该系统,但是当我从该系统请求返回相同的字符串时,它将 Großbeerenstraße 转换为 Grou00dfbeerenstrau00dfe 等等。

根据 David 寻找 u 并检查以下 4 个字符是否为有效的十六进制数字的想法,它看起来像这样:

public string FixGermanUnicode(string input) {
    var output = new StringBuilder();
    for (var i = 0; i < input.Length; i++) {
        if (i < input.Length - 4 && input[i] == 'u' && input[i + 1] == '0'
                && int.TryParse(input.Substring(i + 1, 4), NumberStyles.HexNumber, null, out var code)) {
            try {
                output.Append(char.ConvertFromUtf32(code));
                i += 4;
            } catch (ArgumentOutOfRangeException) {
                //not a valid unicode character
                output.Append(input[i]);
            }
        } else {
            output.Append(input[i]);
        }
    }
    return output.ToString();
}

Console.WriteLine(FixGermanUnicode("Grou00dfbeerenstrau00dfe"));

实际上,它会检查 u0 以防止接下来的 4 个字符是有效的 unicode,但不应该被替换的情况。这至少适用于德语,因为德语中的所有特殊字符都有以 0.

开头的 unicode 代码

这也将捕捉以下 4 位数字是有效的十六进制数字,但生成的十六进制数字不是有效的 unicode 字符的情况。

虽然我完全同意@Gabriel Luci 的回答,但我想指出相同想法的更简洁的实现(它需要“System.Text.RegularExpression”命名空间):

readonly static string unicodePattern = @"u0[0-9a-fA-F]{3}";

public static string FixGermanUnicode(string input)
{
    return Regex.Replace(input, unicodePattern, match =>
    {
        var digits = match.Value.Substring(1);
        try
        {
            return char.ConvertFromUtf32(int.Parse(digits, System.Globalization.NumberStyles.AllowHexSpecifier)).ToString();
        }
        catch (ArgumentOutOfRangeException)
        {
            //not a valid unicode character
            return match.Value;
        }
    });
}