我在C语言上有本文,该论文需要在终端中打印一些希腊句子。在给我们的代码模板中,有这类代码:
system("chcp 1253>nul");
这应该打印希腊字符。在我的Ubuntu终端中,我看到了:
�������� ����� �� ����� ����� ��� �������� ���� ������
那么,如何在终端中打印希腊字符?
这在大多数Linuxes中都受支持。唯一要做的就是使用
setlocale(LC_ALL, "");
在程序的开头。这取决于UTF-8是用户网站编码的默认选择。该标准说此通话切换到用户的当前语言环境。默认值是使用可能支持或可能不支持民族角色的" C"语言环境。
默认情况下,GCC解释了UTF-8中编码的源代码。存在编译时选项可以更改它,但是建议将所有内容保留在Linux上的UTF-8中。来自Windows的来源可能未在UTF-8中编码,需要重新编码。使用iconv
实用程序;如果源与特定的遗留代码页面关联,请尝试该代码页名称作为源编码。
a c程序(与ISO C99或更高版本或更高版本或更高版本的ISO C99或更高版本(,输入或输出非ASCII文本应使用宽字符串,宽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 Western Elecor。
我建议您写一个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(rn
(Newlines更改为LF(n
(,覆盖文件的内容。
(而不是使用第二个临时文件保存内容,将sed
引导到原始文件,而是指原始文件使其所有者和组完整。(