【问题标题】:C - printing greek letters in linux terminalC - 在linux终端中打印希腊字母
【发布时间】:2017-05-03 07:27:20
【问题描述】:

我有这篇关于 C 语言的论文,需要在终端中打印一些希腊语句子。 在提供给我们的代码模板中,有这行代码:

system("chcp 1253>nul");

这应该打印希腊字符。 在我的 Ubuntu 终端中,我看到:

�������� ����� �� ����� ����� ��� �������� ���� ������

那么,如何在终端中打印希腊字符?

【问题讨论】:

  • chcp 来自 Windows。它对 Ubuntu 没有影响。可以使用 UTF-8 语言环境吗?
  • 是的,我想...我可以在哪里使用 UTF-8 语言环境吗?
  • 您可以在终端中使用 UTF-8 语言环境吗?
  • 在我的语言环境中我看到:LANG=el_GR.UTF-8 LANGUAGE=en_US:en 并且所有 LC_ 都设置为 el_GR.UTF-8
  • 看来可以。虽然在我的语言环境中 utf-8 有一个不同的名称:LANG=en_US.utf8。所以你可以尝试用 UTF-8 创建一个源文件,编译它,一切都会好起来的:$ file main.cpp, main.cpp: C source, UTF-8 Unicode text

标签: c linux terminal


【解决方案1】:

这在大多数 Linux 中都得到了开箱即用的支持。唯一必须做的就是使用

 setlocale(LC_ALL, "");

在程序的开头。这依赖于 UTF-8 是用户语言环境的默认编码选择这一事实。标准说这个调用切换到用户的当前语言环境。默认使用“C”语言环境,它可能支持也可能不支持国家字符。

默认情况下,gcc 将源代码解释为 UTF-8 编码。存在编译时选项来改变这一点,但建议在 Linux 上将所有内容都保留为 UTF-8。来自 Windows 的源可能未以 UTF-8 编码,需要重新编码。为此使用iconv 实用程序;l。如果源与特定的旧代码页相关联,请尝试将该代码页名称作为源编码。

【讨论】:

    【解决方案2】:

    输入或输出非 ASCII 文本的 C 程序(符合 ISO C99 或更高版本,或 POSIX.1 或更高版本)应使用宽字符串、宽 I/O 和本地化。

    例如:

    #include <stdlib.h>
    #include <locale.h>
    #include <stdio.h>
    #include <wchar.h>
    
    int main(void)
    {
    
        /* Tell the C library to use the current locale settings. */
        setlocale(LC_ALL, "");
    
        /* Standard output is used with the wide I/O functions. */
        fwide(stdout, 1);
    
        /* Print some Greek text. */
        wprintf(L"Γειά σου Κόσμε!\n");
    
        return EXIT_SUCCESS;
    }
    

    请注意,宽字符串文字使用L"..." 编写,而普通(ASCII 或窄)字符串文字使用"..."。类似地,宽字符常量(wint_t 类型)用L 前缀编写;例如,L'€'


    编译时,您确实需要告诉编译器源代码使用什么字符集。在 Linux 中,GCC 使用区域设置,但还提供了一个选项 -finput-charset=windows-1252 以将其更改为 Windows 西欧,例如。

    我建议您编写一个 Bash 辅助脚本,而不是摆弄标志,例如 to-utf8

    #!/bin/bash
    
    if [ $# -lt 2 ] || [ ":$1" = ":-h" ] || [ ":$1" = ":--help" ]; then
        printf '\n'
        printf 'Usage: %s [ -h | --help ]\n' "$0"
        printf '       %s windows-1252 file.c [ ... ]\n' "$0"
        printf '\n'
        exit 0
    fi
    
    charset="$1"
    shift 1
    
    Work=$(mktemp) || exit 1
    trap "rm -f '$Work'" EXIT
    
    for src in "$@" ; do
        iconv -f "$charset//TRANSLIT" -t UTF-8 "$src" > "$Work" || exit $?
        sed -e 's|\r$||' "$Work" > "$src" || exit $?
        printf '%s: Converted successfully.\n' "$src"
    done
    
    exit 0
    

    如果你愿意,你可以在系统范围内使用

    sudo install -o 0 -g 0 -m 0755 to-utf8 /usr/bin/
    

    第一个命令行参数是源字符集(使用iconv --list 可以查看全部),然后是要修复的文件列表。

    脚本会创建一个自动删除的临时文件。 iconv 行将每个文件的字符集转换为 UTF-8,将结果保存到临时文件中。 sed 文件将任何 CRLF (\r\n) 换行符更改为 LF (\n),覆盖文件的内容。

    (而不是使用第二个临时文件来保存内容,让sed 将其输出定向到原始文件,这意味着原始文件保持其所有者和组不变。)

    【讨论】:

      猜你喜欢
      • 2017-03-09
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 2021-07-16
      相关资源
      最近更新 更多