【发布时间】:2021-12-01 13:43:51
【问题描述】:
我如何知道我的终端希望以哪种方式接收数据?我应该使用fputc、fputwc 还是别的什么?
这是我对fputc 的尝试:
// characters.c
#include <ctype.h>
#include <stdio.h>
int main ( void )
{
for ( int c = 0 ; c <= 65535 ; c ++ )
if ( isgraph ( c ) ) fputc ( c , stdout ) ;
}
还有fputwc:
// wcharacters.c
#include <ctype.h>
#include <stdio.h>
#include <wcahr.h>
int main ( void )
{
for ( wchar_t c = 0 ; c <= 65535 ; c ++ )
if ( isgraph ( c ) ) fputwc ( c , stdout ) ;
}
使用characters.c,输出与终端打印的前几项的ASCII字符一致(!"#等),然后~之后,就是垃圾了。
我得到与wcharacters.c 类似的结果,除了它不是垃圾,而是? 或其他一些ASCII 字符(但绝大多数是? 的)。
我知道同一个终端支持 Unicode 代码点范围 33 到 65535(十进制)中的许多字符表示,因为我可以使用 Python 3 打印其中的许多字符。
我正在使用Trisquel GNU/Linux、gcc (-std=c99) 和“MATE Terminal”。字体是“Monospace”,听起来很一般,但它似乎支持更多超出 ASCII 范围的字符。
我愿意使用更新的 C 标准。同时,我正在做的项目的一个重点是简单,C 标准似乎随着每个后续标准变得越来越复杂(使用 C17 的uchar.h 会更简单吗?)。
使用我正在开发的功能,用户应该能够将任何图形字符(如isgraph)写入stdout 并且这些字符的外观是“正确的”。
附录
回应@chux-reinstate-monica:
isgraph()可以使用窄字符,不适用于宽字符。
比characters.c 更好的测试可能是:
// charactersAll.c
#include <ctype.h>
#include <limits.h>
#include <stdio.h>
int main ( void )
{
const int cmax = (
(unsigned) UCHAR_MAX < (unsigned) INT_MAX
) ? (int) UCHAR_MAX : INT_MAX ;
int c = -1 ;
while ( c < cmax )
{
c ++ ;
if ( isgraph ( c ) ) fputc ( c , stdout ) ;
}
}
对比字符.c:
-
循环遍历所有有效的
isgraph参数。 -
避免溢出:
characters.c可能会尝试增加c超过最大值(即,当int为 16 位时;确认:@chux-reinstate-monica,“aside”)。
【问题讨论】:
-
The font is "Monospace,"有“后备”,当您默认使用的字体缺少代码点时,会检查另一种字体是否具有该字符。在我的系统上/etc/fonts/conf.d/45-generic.conf和60-generic.conf和<alias< binding="same"><family>emoji</family<prefer>...。
标签: c terminal character stdout non-ascii-characters