C++를 사용하여 ASCII 확장 테이블 인쇄(키릴 문자 - 우크라이나어 문자는 인쇄되지 않음)

C++를 사용하여 ASCII 확장 테이블 인쇄(키릴 문자 - 우크라이나어 문자는 인쇄되지 않음)

따라서 우크라이나어 알파벳(Cili 알파벳)이 포함되어야 하는 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로 전환되었으므로 이러한 모호성은 더 이상 우리에게 영향을 미치지 않습니다. (이것의 단점은 열거할 유니코드 코드 포인트를 알아야 하기 때문에 작성 중인 정확한 프로그램을 작성하기가 더 어렵다는 것입니다. 바이트 값으로 키릴 문자를 얼마나 자주 지정하고 싶은지 잘 모르겠습니다. 실제로는 "절대로"에 가까울 것으로 예상됩니다)

이제 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바이트로 표시됩니다.

"П"는 208-159, "р"는 209-128 등입니다.

ua_str[4]세 번째 문자의 페이지 바이트를 직접 가리킵니다 .

관련 정보