[英]C - printing greek letters in linux terminal
我有關於C語言的本文,要求在終端中打印一些希臘句子。 在提供給我們的代碼模板中,有以下代碼行:
system("chcp 1253>nul");
這應該打印希臘字符。 在我的Ubuntu終端中,我看到:
�������� ����� �� ����� ����� ��� �������� ���� ������
那么,如何在終端中打印希臘字符?
在大多數Linux中都是開箱即用的。 唯一要做的就是使用
setlocale(LC_ALL, "");
在程序的開始。 這依賴於以下事實:UTF-8是用戶語言環境的默認編碼選擇。 標准說此調用切換到用戶的當前區域設置。 默認值為使用“ C”語言環境,該語言環境可能支持也可能不支持國家字符。
默認情況下,gcc將源代碼解釋為以UTF-8編碼。 存在編譯時選項可以更改此設置,但是建議將所有內容保留在Linux的UTF-8中。 來自Windows的源可能未使用UTF-8編碼,需要重新編碼。 為此,請使用iconv
實用程序; l。 如果源與特定的舊版代碼頁相關聯,請嘗試使用該代碼頁名稱作為源編碼。
輸入或輸出非ASCII文本的AC程序(符合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 Western European。
建議您編寫一個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
將其輸出定向到原始文件,這意味着原始文件將其所有者和組保持完整。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.