C语言 在Linux程序中无法使用退格键完全删除UTF-8字符

o8x7eapl  于 2023-01-01  发布在  Linux
关注(0)|答案(1)|浏览(122)
    • bounty将在6天后过期**。回答此问题可获得+50声望奖励。Markity希望引起更多人关注此问题。

我有一个C程序等待用户输入

#include <stdio.h>

int main()
{   
    getchar();

    return 0;
}

现在我运行它,输入一些汉字,如测试测试。然后现在我点击退格键,我发现我不能完全删除这些字符(一些空白)
我发现termios有一个标志设置IUTF8,但为什么它不工作?
2022年12月31日更新:
我试着更详细地描述我的问题,我有一个这样的程序

现在我运行它,并输入一些中文字符(没有回车键)

然后我不停的按退格键(直到什么都擦不掉),但是一半的内容仍然显示在我的屏幕上,这太不正常了,我该怎么做才能让擦除效果好呢?

我知道这对你来说是个愚蠢的问题。我只是想在输入一些UTF8字符(比如汉字)时让它更舒服一些。
我发现shell可以很好地处理这个问题,我该怎么做才能让我的程序执行相同的功能呢?
顺便说一下,这是我的语言环境输出

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=zh_CN.UTF-8
LC_TIME=zh_CN.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=zh_CN.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=zh_CN.UTF-8
LC_NAME=zh_CN.UTF-8
LC_ADDRESS=zh_CN.UTF-8
LC_TELEPHONE=zh_CN.UTF-8
LC_MEASUREMENT=zh_CN.UTF-8
LC_IDENTIFICATION=zh_CN.UTF-8
LC_ALL=
bvjxkvbb

bvjxkvbb1#

使用GNU readline可以提供一个类似shell的界面,带有Tab自动完成功能、正确的输入处理等。
要编译下面的示例程序,请确保您已经安装了libreadline-dev包。运行该程序所需的readline库已经安装,因为许多默认安装的应用程序都需要它。

// SPDX-License-Identifier: CC0-1.0
// Compile using
//    gcc -Wall -O2 $(pkg-config --cflags readline) example.c $(pkg-config --libs readline) -o example

#define  _GNU_SOURCE
#include <stdlib.h>
#include <locale.h>
#include <readline/readline.h>
#include <readline/history.h>
#include <stdio.h>

int main(void)
{
    char *line;

    setlocale(LC_ALL, "");

    while (1) {
        line = readline(NULL);  // No prompt

        // Input line is in 'line'; exit if end of input or empty line.
        if (!line || *line == '\0')
            break;

        // Do something with 'line'

        // Discard the dynamically allocated line
        free(line);
    }

    return 0;
}

当使用GNU readline库时,该库接管了标准输入,并在终端(termios)级别处理字符删除(和许多其他事情)。它在文件和管道输入方面也工作得非常好,例如bash shell就使用它进行交互式输入。

相关问题