如何在C#中将上标数转换为unicode?我在上标中有很多我想要转换的数字,所以我会做一个循环,但我无法弄清楚如何将它们转换为unicode。
上标数字示例:⁰¹³⁴⁵⁶⁷⁸⁹¹¹¹¹¹¹¹¹¹¹¹¹¹
由于
答案 0 :(得分: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(真) - > 11 12(真) - > 12 13(真) - > 13¹ (真) - > 14¹(真) - > 15¹(真) - > 16 17(假) - > 18(假) - > 19(假) - > XX(假) - > XXI(假) - > XXII(假) - > XXIII(假) - > XXIV(错误) - >
请注意,要使控制台显示正确的字符,需要Console.OutputEncoding = System.Text.Encoding.Unicode;
。我还必须使用控制台字体来正确显示内容。