为什么readline库中的readline()不接受UNICODE? ANSI C语言

时间:2017-07-03 07:20:05

标签: c linux unicode readline

我写了简单的应用程序:

#include <stdio.h>
#include <stdlib.h>
#include <readline/readline.h>
#include <readline/history.h>

int main()
{
    char *user_input;

    while(user_input = readline("> ")) {
        printf("%s\n", user_input);
        free(user_input);
    }
    return 0;
}

当应用程序启动时,它应该接受用户输入,并且在换行符(输入键)之后应该打印我写的内容。

它适用于像'a','b'这样的角色,但不适用于波兰语'ł'。此char被编码并作为unicode发送。告诉我为什么?我该怎么做才能告诉readline使用UNICODE并正确显示多字节字符?

我的readline版本是6.3

我添加了我的语言环境设置:

# locale
LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

将语言环境更改为波兰语仍然无效:

# locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=pl_PL.utf8
LC_CTYPE="pl_PL.utf8"
LC_NUMERIC="pl_PL.utf8"
LC_TIME="pl_PL.utf8"
LC_COLLATE="pl_PL.utf8"
LC_MONETARY="pl_PL.utf8"
LC_MESSAGES="pl_PL.utf8"
LC_PAPER="pl_PL.utf8"
LC_NAME="pl_PL.utf8"
LC_ADDRESS="pl_PL.utf8"
LC_TELEPHONE="pl_PL.utf8"
LC_MEASUREMENT="pl_PL.utf8"
LC_IDENTIFICATION="pl_PL.utf8"
LC_ALL=

仍然没有使用下面的conf:

# export LANG="en_us.utf-8"
# bash
# locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_us.utf-8
LC_CTYPE="en_us.utf-8"
LC_NUMERIC="en_us.utf-8"
LC_TIME="en_us.utf-8"
LC_COLLATE="en_us.utf-8"
LC_MONETARY="en_us.utf-8"
LC_MESSAGES="en_us.utf-8"
LC_PAPER="en_us.utf-8"
LC_NAME="en_us.utf-8"
LC_ADDRESS="en_us.utf-8"
LC_TELEPHONE="en_us.utf-8"
LC_MEASUREMENT="en_us.utf-8"
LC_IDENTIFICATION="en_us.utf-8"
LC_ALL=
# 

1 个答案:

答案 0 :(得分:1)

您正在使用不支持Unicode的POSIX语言环境。

您可以将整个用户帐户切换到其中一个utf-8语言环境(en_us.utf-8是一个很受欢迎的语言环境)。请参阅操作系统文档,了解如何执行此操作。

您还可以适当地设置LANG环境变量以临时将shell会话切换到任何语言环境,或使用特定的语言环境名称作为setlocale的参数(确保安装了相关的语言环境)。

请注意,除非 it 使用正确的区域设置,否则您的终端模拟器可能会或可能不会正确显示Unicode字符。建议的方法是将用户帐户切换为utf-8语言环境。

这一切都适用于Linux,BSD系列以及其他类Unix系统。 Windows有自己独特的怪癖。