C ++を使用したASCII拡張テーブルの印刷(キリル文字 - ウクライナ語の文字は印刷されません)

C ++を使用したASCII拡張テーブルの印刷(キリル文字 - ウクライナ語の文字は印刷されません)

したがって、ウクライナ語のアルファベットを含める必要があるASCII拡張テーブルを印刷したいと思います。C++私はKDE neon 5.26.NETベースのLinuxディストリビューションを使用していますUbuntu。端末は明らかにKDEですConsole

マイシステム情報

私は次のコードを書いた。

#include<iostream>

int main(void) {

        for (unsigned char i = 32; int(i) < 255; i++) {
                std::cout <<" [" << i << "] " << int(i) << " \t";
                if ((i-1)%5 == 0)
                        std::cout << "\n";
        }

        char ua_str[] = "Привіт";  // hello in ukrainian
        std::cout << "\n\n" << ua_str << "\n" << ua_str[4] << " is " << int(ua_str[4]) << "\n";

        return std::cout.fail() ? EXIT_FAILURE : EXIT_SUCCESS;
}

にコンパイルしてくださいg++ lab3.cpp。次の出力が生成されます。

ここに画像の説明を入力してください。

私が興味を持っているのはどのように印刷されますが、印刷されないのですchar ua_str[]ua_str[4]

ターミナルエンコーディングがに設定されていますが、ターミナルエンコーディング設定には見つかりませんUTF8。出力をテキストファイルASCIIにリダイレクトして開くと、次のようになります。 abc.txt./a.out > abc.txtここに画像の説明を入力してください。

だからlocale -a端末で実行します。
ここに画像の説明を入力してください。

その後、ループの前にプログラムに追加しようとしましたが、std::setlocale(LC_ALL, "uk_UA.utf8");何も変更されず、出力は同じでした...int main(void)for

後で音訳スクリプトを作成しようとしていますが、印刷できず、ウクライナの文字で正しく機能しません。

C++したがって、質問は次のようになります。でキリル文字を印刷して使用する方法はKDE neon 5.26

答え1

問題は、UTF-8が拡張ASCIIエンコーディングではないため(127バイトよりも多くの解釈があるため)試しても機能しないことです。端末に何かをUTF-8として解釈するように指示していますが、そうではありません。

あなたがすべきことは、どの特定のエンコーディングを使用したいのかを把握することです。先生がISO / IEC 8859-5に言及したようですが、わかりません。知っている唯一の方法は尋ねることです。または、正しい文字を表示するときに使用するようにテキストエディタに指示したエンコーディングを使用することです。これは試しやすい方法です。
それ自体は、エディタ、コンソール、または人がISO / IEC 8859-5を参照するのか、他のASCII拡張を参照しているのかを知る方法はありません(より正確には:コードページ)。

引用するウィキペディアこの点について:

「拡張ASCII」という用語の使用は、ASCII規格がより多くの文字を含むように更新されているか、またはその用語が単一のエンコーディングを明確に識別するという意味で誤って解釈される可能性があるため、時には批判されます。

ここでこのあいまいさを見ることができます。

だから正直なところ、これはおそらくC ++初心者にとって最高の練習ではありません。幸いなことに、世界はほとんどUTFに移行しているので、このあいまいさはもはや私たちに影響を与えません。 (これの欠点は、列挙するUnicodeコードポイントを知る必要があるため、書いている正確なプログラムを書くのがより難しいことです。予想される)

8859-1を使用するように設定してコンソールを停止するか、8859-1をutf-8に変換して印刷する方法を学びます。後者はより賢明なアプローチになります!ソースコードはまだUTF-8なので、文字列での挨拶はすぐに機能します。

それでは、「従来の」拡張ASCIIエンコーディングをUTF-8にどのように変換しますか?ちょっと探してみるべきですね。私はドイツ人で、名前にウムラウトがあり、UTF-8がオプションになって以来、UTF-8以外のものを使用することを考えたことはありません。

答え2

UTF-8はマルチバイトエンコーディングです。ソースにループを追加します。

    for (int i = 0; i < sizeof(ua_str); i++) {
            std::cout << ua_str[i] << " is " << (0xFF & ua_str[i]) << "\n";
    }

これで、6文字の文字列が実際には12バイトの配列であることがわかります。各文字は2バイトで表示されます。

「P」は208-159、「r」は209-128などです。

ua_str[4]3番目の文字のページバイトを直接指します。

関連情報