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–True(正确)->9
°(真)->10(正确)->11(正确)->12(正确)->13
(正确)->14(正确)->15(正确)->16 17(错误)->18(假)
-&燃气轮机;19(错误)->XX(错误)->XXI(错误)->二十二(假)->二十三(假)->二十四(假)->
请注意
Console.OutputEncoding = System.Text.Encoding.Unicode;
需要获取控制台以显示正确的字符。我还必须使用控制台字体才能正确显示。