在C#中将上标转换为Unicode

时间:2018-04-04 16:07:06

标签: c# unicode

如何在C#中将上标数转换为unicode?我在上标中有很多我想要转换的数字,所以我会做一个循环,但我无法弄清楚如何将它们转换为unicode。

上标数字示例:⁰¹³⁴⁵⁶⁷⁸⁹¹¹¹¹¹¹¹¹¹¹¹¹¹

由于

1 个答案:

答案 0 :(得分:1)

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⁹(真) - > 9   ¹⁰(真) - > 10 11(真) - > 11 12(真) - > 12 13(真) - > 13¹   (真) - > 14¹(真) - > 15¹(真) - > 16 17(假) - > 18(假)    - > 19(假) - > XX(假) - > XXI(假) - > XXII(假) - > XXIII(假) - > XXIV(错误) - >

请注意,要使控制台显示正确的字符,需要Console.OutputEncoding = System.Text.Encoding.Unicode;。我还必须使用控制台字体来正确显示内容。