【问题标题】:In c# How to convert back unicoded characters to UTF-8?在 c# 中,如何将 unicode 字符转换回 UTF-8?
【发布时间】:2020-09-30 04:33:55
【问题描述】:

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

  1. 只转换部分字符(特殊字符),而不是整个文本
  2. Unicode 文本通常具有转义字符,例如 \u00df,而不是 u00df

您能帮我正确转换回原来的状态吗? 基本上,如果没有转义字符,我该如何转换?

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

【问题讨论】:

  • 不是00df,而是u00df,所以u 还在,但是\ 已经被去掉了。不幸的是,这使字符串模棱两可,但我会首先查找每个 u 并检查以下 4 个字符是否是有效的十六进制数字。
  • 你是对的,它是 u00df 但没有例外字符

标签: c# unicode utf-8


【解决方案1】:

根据 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 字符的情况。

【讨论】:

    【解决方案2】:

    虽然我完全同意@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;
            }
        });
    }
    

    【讨论】:

      猜你喜欢
      • 2012-07-02
      • 2012-02-22
      • 1970-01-01
      • 2019-07-20
      • 2021-07-06
      • 2017-04-23
      • 2010-09-21
      • 2016-09-02
      • 1970-01-01
      相关资源
      最近更新 更多