我正在编写一段处理数学变量和指数的代码,并且需要在CLI上打印下标和上标,是否有一种(可能是跨平台的)方法来实现这一点?我正在使用原始的C++。
注意:我希望这可以跨平台,但由于第一个答案似乎不可能,所以我正在MacOS和Ubuntu Linux下工作(因此使用bash)。
谢谢!
注意:我希望这可以跨平台,但由于第一个答案似乎不可能,所以我正在MacOS和Ubuntu Linux下工作(因此使用bash)。
谢谢!
由于大多数 CLI 实际上只是终端(主要是相当愚蠢但有时具有颜色),我曾经使用的唯一跨平台方法是为每个虚拟行分配多个物理行,例如:
2
f(x) = x + log x
2
虽然不是理想的解决方案,但在没有图形界面的情况下这可能是最好的选择。
以下是关于你主要感兴趣的平台的额外信息:
至少在Ubuntu上,gnome-terminal默认以UTF-8模式运行,因此以下代码展示了如何生成上标和下标:
#include <stdio.h>
static char *super[] = {"\xe2\x81\xb0", "\xc2\xb9", "\xc2\xb2",
"\xc2\xb3", "\xe2\x81\xb4", "\xe2\x81\xb5", "\xe2\x81\xb6",
"\xe2\x81\xb7", "\xe2\x81\xb8", "\xe2\x81\xb9"};
static char *sub[] = {"\xe2\x82\x80", "\xe2\x82\x81", "\xe2\x82\x82",
"\xe2\x82\x83", "\xe2\x82\x84", "\xe2\x82\x85", "\xe2\x82\x86",
"\xe2\x82\x87", "\xe2\x82\x88", "\xe2\x82\x89"};
int main(void) {
int i;
printf ("f(x) = x%s + log%sx\n",super[2],sub[2]);
for (i = 0; i < 10; i++) {
printf ("x%s x%s ", super[i], sub[i]);
}
printf ("y%s%s%s z%s%s\n", super[9], super[9], super[9], sub[7], sub[5]);
return 0;
}
super
和sub
char*数组是Unicode数值上标和下标的UTF-8编码(请参见这里)。给定的程序将输出我的上述公式(一行而不是三行),然后是所有选择的另一条测试线,以及一个y-super-999和z-sub-75,以便您可以看到它们的样子。我需要在CLI上打印下标和上标,有没有跨平台的方法可以做到这一点?
只有当您拥有一个支持Unicode的终端时才能实现,但这并不是保证的。 Unicode定义了有限数量的下标和上标“兼容字符”,您肯定不能在任何旧字母上使用它:
₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎ₐₑₒₓ
⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿⁱ
即使如此,您仍然依赖于控制台字体中是否有该字符的字形,这也远非保证。上标2和3可能存在,因为它们在ISO-8859-1中存在;其他字符可能无法正常工作。