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; 是让控制台显示正确字符所必需的。我还必须使用控制台字体才能正确显示。