Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c#中,如何将Unicode字符转换回UTF-8?_C#_Unicode_Utf 8 - Fatal编程技术网

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

在c#中,如何将Unicode字符转换回UTF-8?,c#,unicode,utf-8,C#,Unicode,Utf 8,我有这个文本Grou00dfbeerenstrau00dfe,我需要将它转换成Großbeerenstrae 同时Eichstu00e4tt至EICHSTTätt 但我并没有完全理解和解决这个问题,原因如下: 仅转换部分字符(特殊字符),而不是整个文本 未编码文本通常具有转义字符,如\u00df,而不是u00df 你能帮我把它正确地转换回原来的状态吗? 基本上,当没有转义字符时,如何转换 注意:如果你一定要知道,我正在向某个系统发送一些特殊的字符字符串。我无法触摸这个系统,但当我请求从该系统返

我有这个文本
Grou00dfbeerenstrau00dfe
,我需要将它转换成
Großbeerenstrae
同时
Eichstu00e4tt
EICHSTTätt
但我并没有完全理解和解决这个问题,原因如下:

  • 仅转换部分字符(特殊字符),而不是整个文本
  • 未编码文本通常具有转义字符,如
    \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"));
    
    公共字符串FixGermanUnicode(字符串输入){
    var输出=新的StringBuilder();
    对于(变量i=0;i
    实际上,它会检查
    u0
    ,以防止接下来的4个字符是有效的unicode字符,但不应该被替换。这至少适用于德语,因为德语中的所有特殊字符都有以
    0
    开头的unicode代码


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

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


    它不是
    00df
    ,但是它是
    u00df
    ,因此
    u
    仍然存在,但是\已经被剥离。不幸的是,这使字符串变得模棱两可,但我将首先查找每个
    u
    ,并检查以下4个字符是否为有效的十六进制数。您是正确的,它是u00df,但没有excape字符
    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;
            }
        });
    }