C中的跨平台彩色文本



我想知道如何在C中以跨平台的方式打印彩色文本。我已经查看了论坛上的所有其他答案,但在我的测试(在Windows上(中,它们都不起作用。对于C++,我在图1中有工作代码,但当将代码转换为C并将字符串分配给变量时,我会得到错误u001b is not a valid universal character(表2(。

图1

namespace Fore {
const std::string BLACK = "u001b[30m";
// Rest of code is not included since it is just a repetition of the above code with background and style ANSI codes as well. 

图2

图片在这里,因为我还没有足够的声誉来嵌入图片。

C和C++对"通用字符名";(UCNs(,这是uU序列的官方名称。(它们与"转义序列"不同,因为UCN可以在引用的文字之外使用,例如在标识符名称中。(

在C中,规则是:

通用字符名不应指定十六进制值为的代码点

  • 小于00A0,而不是0024($(、0040(@(或0060(`(
  • 在包括D800到DFFF的范围内;或
  • 大于10FFFF82(

因此,在C中,不能将UCN用于控制字符,这就是错误消息告诉您的。

C++更慷慨;它允许您将UCN用于控制字符和其他具有小代码点的字符,但仅限于字符串和字符文本内部。(C++还禁止代理代码点和过大代码,即上述列表中的第二点和第三点。(

C和C++都允许您使用八进制转义序列(33(或十六进制转义顺序(x1B(。我个人推荐后者,但33很常见,因为十六进制转义不在C的最早版本中,因此33成为了一种常见的习惯用法。

这些都不是真正独立于平台的。许多平台都有不解释ANSI风格代码的控制台。

在文本标记化之前,编译器将uxxxx序列解释为输入源文本的方式。您在字符串文本中包含了一个控制字符(而不是编译器转义序列((就像您在字符串中按字面键控它一样(。只需通过转义序列更改控制字符,如:

const std::string BLACK = "x1b[30m";

或者,更重要的是(八进制表示包含在前C编译器中,而xAB表示法是在ANSI-C中引入的(:

const std::string BLACK = "33[30m";

这两个序列都向编译器表明,您希望在编译器输出中放入等效字符,但它们是四个字符序列,而不是一个字符序列。两者都在C/C++中工作。

顺便说一句,一种可移植的彩色输出方法是使用类似termcap(curses的一部分(的库,它从运行环境中确定终端类型,从而为所用终端选择合适的序列。有关termcap库的信息,请参阅termcap(curs_termpcap(3X((的手册页面。如果您需要更高级的函数(如光标寻址或窗口(,则可以选择完整的ncurses库。这个库是在vi编辑器诞生时开发的,当时使用了大量不同类和控制语言的终端。

最新更新