代码之家  ›  专栏  ›  技术社区  ›  Taqwa

在C#[已关闭]中将上标转换为Unicode

  •  -1
  • Taqwa  · 技术社区  · 8 年前

    如何在C#中将上标数字转换为unicode?我想转换上标中的许多数字,所以我会进行循环,但我不知道如何将它们转换为unicode。

    上标数字示例:上标数字

    谢谢

    1 回复  |  直到 8 年前
        1
  •  1
  •   Wearwolf    8 年前

    C#字符串始终是Unicode(UTF-16),因此,如果可以加载文本而不发出问题,那么它已经是Unicode了。如果你没有得到你想要的文本,那么你需要研究编码和你是如何阅读文本的。

    基于 Unicode subscripts and superscripts 上标不在一个连续的块中,这使得它们很难被检测到。因此,查看是否有上标的最简单方法是使用switch语句。

        static bool IsSuperscript(char c)
        {
            switch(c)
            {
                case '⁰':
                case '¹':
                case '²':
                case '³':
                case '⁴':
                case '⁵':
                case '⁶':
                case '⁷':
                case '⁸':
                case '⁹':
                    return true;
                default:
                    return false;
            }
        }
    

    然后,要查看字符串是否只包含上标字符,只需对其进行循环。

        static bool IsSuperscript(string s)
        {
            foreach(var c in s)
            {
                if(!IsSuperscript(c))
                {
                    return false;
                }
            }
    
            return true;
        }
    

    如果要将上标字符转换为普通数字字符,可以使用类似的switch语句。

        static bool TryNormalizeSuperscript(char superC, out char c)
        {
            bool result = true;
            switch (superC)
            {
                case '⁰':
                    c = '0';
                    break;
                case '¹':
                    c = '1';
                    break;
                case '²':
                    c = '2';
                    break;
                case '³':
                    c = '3';
                    break;
                case '⁴':
                    c = '4';
                    break;
                case '⁵':
                    c = '5';
                    break;
                case '⁶':
                    c = '6';
                    break;
                case '⁷':
                    c = '7';
                    break;
                case '⁸':
                    c = '8';
                    break;
                case '⁹':
                    c = '9';
                    break;
                default:
                    c = '\0';
                    result = false;
                    break;
            }
    
            return result;
        }
    

    和循环

        static string NormalizeSuperscript(string s)
        {
            var sb = new StringBuilder();
            foreach (var superC in s)
            {
                if(TryNormalizeSuperscript(superC, out char c))
                {
                    sb.Append(c);
                }
                else
                {
                    break;
                }
            }
    
            return sb.ToString();
        }
    

    请注意,此循环在找到的第一个非上标字符处停止。根据可能需要更改的用例。

    示例用法:

        static void Main(string[] args)
        {
            Console.OutputEncoding = System.Text.Encoding.Unicode;
            var superscripts = "⁰ ¹ ² ³ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ¹⁰ ¹¹ ¹² ¹³ ¹⁴ ¹⁵ ¹⁶ 17 18 19 XX XXI XXII XXIII XXIV";
            foreach(var superscript in superscripts.Split(' '))
            {
                Console.WriteLine($"{superscript} ({IsSuperscript(superscript)}) -> {NormalizeSuperscript(superscript)}");
            }
        }
    

    输出:

    °(真)->0(真)->1(正确)->2(正确)>3(正确)->4. –µ(真)->5–掴¶(正确)->6–“正确”->7–揘(正确)->8–True(正确)->9 °(真)->10(正确)->11(正确)->12(正确)->13 (正确)->14(正确)->15(正确)->16 17(错误)->18(假) -&燃气轮机;19(错误)->XX(错误)->XXI(错误)->二十二(假)->二十三(假)->二十四(假)->

    请注意 Console.OutputEncoding = System.Text.Encoding.Unicode; 需要获取控制台以显示正确的字符。我还必须使用控制台字体才能正确显示。