본문 바로가기
놀기/Qt

Qt 한글 깨짐 문제

by Hi~ 2023. 9. 23.

한글을 Widget에 표시할 때 한글 깨짐 문제가 발생한다.

Qt Creator에서 Widget을 만든 후, 한글을 넣을 때는 상관없지만 소스 코드에서 한글을 넣게 되면 한글 깨짐이 나타난다.

 

Qt 한글 깨짐 문제 관련해서 게시물이 많다.

게시물을 작성한 분은 해결한 후 작성했겠지만, 문제 해결에 큰 도움이 되지는 않았다.

 

그러던 도중 좋은 게시물을 하나 찾았다.

https://thirdnsov.github.io/programming/2021/10/10/P_Qt_Korean.html

 

Qt 한글 깨짐 문제 · T-Dev

개발을 하다보면 영어가 아닌 한글을 UI에 디스플레이 해야하는 경우가 있다. 여러 개발 환경 중 Qt에서 한글이 깨지지 않도록 하는 방법을 정리했다. 개발 환경 Windows 11 Qt 5.14.2 (with Qt Creator) MSVC

thirdnsov.github.io

 

리눅스에서도 괜찮은 한글 문제가 윈도우즈에서 왜 나타나는지 의문이었는데 컴파일러에 대한 부분을 간과하고 있었다. 만약 MSVC가 아닌 MinGW를 사용하고 있었다면 한글 사용에 큰 문제가 없었을 것이다.

 

각설하고 코드를 보자.

 

일단, 한글을 사용하기 때문에 당연히 파일은 UTF-8 형식을 사용한다.

 

한글을 사용하는 방법이 많은데, 맞는 방법이건 틀린 방법이건 아래 방법 모두 MSVC에서 기본적으로 깨진다. 어쨌든 모두 해보자.

void MainWindow::on_pushButton_clicked()
{
    ui->label->setText("[1] 우리나라");
    qDebug() << "[1] : " << ui->label->text();

    ui->label_2->setText("[2] " + QString::fromUtf8("우리나라"));
    qDebug() << "[2] : " << ui->label_2->text();

    ui->label_3->setText("[3] " + QString(QString::fromLocal8Bit("우리나라").constData()));
    qDebug() << "[3] : " << ui->label_3->text();

    ui->label_4->setText("[4] " + QString::fromLatin1("우리나라"));
    qDebug() << "[4] : " << ui->label_4->text();

    QTextCodec* codec5 = QTextCodec::codecForName("EUC-KR");
    ui->label_5->setText("[5] " + codec5->toUnicode("우리나라"));
    qDebug() << "[5] : " << ui->label_5->text();

    QTextCodec* codec6 = QTextCodec::codecForName("UTF-8");
    ui->label_6->setText("[6] " + codec6->toUnicode("우리나라"));
    qDebug() << "[6] : " << ui->label_6->text();

    ui->label_7->setText("[7] " + codec6->toUnicode(qPrintable(QString::fromUtf8("우리나라"))));
    qDebug() << "[7] : " << ui->label_7->text();

    fprintf(stderr, "[10] : %s\n", QString::fromUtf8("우리나라").toLocal8Bit().constData());

    fprintf(stderr, "[11] : %s\n", qPrintable(QString::fromUtf8("우리나라")));
}

 

이런...

모두 깨져 나온다.

 

 

MSVC에서 utf-8 처리가 가능하도록 .pro 파일에 다음과 같이 추가한다. MinGW일 때는 인식되지 않는 내용으로 msvc일 때로 한정한다.

win32-msvc* {
    QMAKE_CXXFLAGS += /utf-8
}

 

이제 실행하면 아래와 같이 나온다. 한글이 제대로 표시된 곳은 처리 방식에 문제가 없는 것이고 깨진 부분은 한글 처리에 문제가 있는 방식이다. 

 

참고로, [10][11]은 printf()를 사용하여 출력한 예시다.

 

한글 깨짐 문제 또한 다양한 방법이 있겠지만, 옵션 변경을 통해 간단히 해결하는 것도 좋은 방법이지 않을까 한다. 이런 문제 간단히 처리하고 남는 시간에 독서나 합니다. ^^

 

소스코드가 구리고 지저분하지만 필요한 분은 다운로드 ㅎㅎ

 

bmKoreanStringTest-master.zip
0.01MB

댓글