【问题标题】:Converting superscript to Unicode in C# [closed]在 C# 中将上标转换为 Unicode [关闭]
【发布时间】:2018-09-14 06:58:55
【问题描述】:

如何在 C# 中将上标数字转换为 unicode?我有很多上标数字要转换,所以我会做一个循环,但我不知道如何将它们转换为 unicode。

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

谢谢

【问题讨论】:

  • 这些“上标数字”当前存储在哪里?数据库?一份文件?程序中的字符串?
  • 它们将从网站中获取并存储在字符串中。我会检查字符串是否包含上标,所以我认为最好的方法是将它们转换为 unicode 并将它们与另一个包含所有上标 unicode 的字符串数组进行比较(直到 40)。
  • "¹⁶" 是一个双字符字符串,并且这两个字符都是 Unicode 的一部分。您是否已经在 C# 中有该字符串,您的意思是将其转换为两个字符的字符串 "16",还是您的问题是关于获取未知编码的数据以最终成为 C# 中的正确字符? “转换为 Unicode”并不是真正有意义的操作。 “UTF-8 编码”可能是。
  • 我只是想检查我从网站上获取的字符串是否包含上标。
  • 您是否只需要一个已有的字符串。只需在数字周围加上双引号。 Net 中的字符串和 unicode 一样是两个字节的对象。

标签: c# unicode


【解决方案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 ¹²(真)-> 12 ¹³(真)-> 13 ¹⁴ (真)-> 14 ¹⁵(真)-> 15 ¹⁶(真)-> 16 17(假)-> 18(假) -> 19(假)-> XX(假)-> XXI(假)-> XXII(假)-> XXIII(假)-> XXIV(假)->

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

【讨论】:

    猜你喜欢
    • 2014-06-05
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 2021-12-12
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    相关资源
    最近更新 更多