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

Posted

技术标签:

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

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

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

谢谢

【问题讨论】:

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

【讨论】:

以上是关于在 C# 中将上标转换为 Unicode [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中将 HTML 实体转换为 Unicode 字符

在 C# 中将对象数组转换为浮点数组 [关闭]

如何在c#中将对象转换为数组? [关闭]

在 C# 中将通用列表转换为数据集 [关闭]

如何在 C# 中将 .docx 转换为 .pdf [关闭]

在 Dart (Flutter) 中将日期时间转换为 C# timetick [关闭]