在 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 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章