문자집합, 인코딩 문제좀 도와주세요

vivisection의 이미지

windows용 gcc로 작업중입니다

소스파일 인코딩 - utf-8

#define UNICODE
MessageBoxA(hMainWnd, "한글깨짐", "한글깨짐", MB_OK);
SetWindowTextW(hMainWnd, L"한글잘됨);

위에껀 한글이 깨지고 아래껀 한글이 잘나옵니다

소스파일 인코딩 - euc-kr
#define UNICODE
MessageBoxA(hMainWnd, "한글잘됨", "한글잘됨", MB_OK);
SetWindowTextW(hMainWnd, L"컴파일에러");

에러내용은
error: converting to execution character set: iLLegal byte sequence

물론 MultibyteToWidechar(), mbstowcs() 다 해봤습니다

한 프로그램안에서 euc-kr, utf-8, std::wstring 다 다뤄야 합니다
이거 어떻게 해야 해결되는지 아시는분 좀 도와주세요

Anti-Lock의 이미지

소스파일 인코딩 - utf-8 의 경우에,

MessageBoxA(hMainWnd, "한글깨짐", "한글깨짐", MB_OK);

대신에

MessageBoxW(hMainWnd, L"한글잘될까", L"한글잘될까", MB_OK);

로 하시면 되지 않나요?
SetWindowTextW 는 잘 되신다면요...

vivisection의 이미지

MessageBoxW(hMainWnd, L"한글잘될까", L"한글잘될까", MB_OK);
하면 잘 되긴 하지만, 저기만 그런게 아니라, 텍스트파일이나 소켓으로 euc-kr, utf-8등 문자열들을 불러오고 가공하고 해야합니다
일단 wchar_t로 변환부터하면 좀 편한데, 변환함수도 소스파일 인코딩에 따라 컴파일에러가 날때도 있고, 문자집합 변환관련 헤딩 10시간째입니다

Anti-Lock의 이미지

컴파일러를 gcc 쓰시나 보군요.

#include <windows.h>
 
int main(int argc, char const *argv[])
{
	HWND hMainWnd = NULL;
 
	MessageBoxA(hMainWnd, "한글깨짐", "한글깨짐", MB_OK);
	MessageBoxW(hMainWnd, L"한글잘됨L", L"한글잘됨L", MB_OK);
	return 0;
}

이 코드는 인코딩이 utf-8 일 경우, gcc 에서는 "한글깨짐"은 깨지고 "한글잘됨L" 은 한글이 잘 됩니다.
(왜 utf-8 문자열이 ucs-2 문자열을 기대하는 함수에 들어가서 제대로 작동하는지는 의문입니다만...)
인코딩이 euc-kr 일 경우, gcc 에서는 컴파일 에러가 납니다.

그런데, 위 코드의 인코딩이 utf-8 이거나, euc-kr 이거나 관계 없이
msvc (cl.exe) 일 경우, "한글깨짐" 도 잘 나오고 "한글잘됨L" 도 한글이 잘 됩니다.
cl.exe 는 문자열 상수앞에 L 을 붙이면 컴파일러 매직이 있는것 같습니다.

vivisection의 이미지

msvc 진짜 눈물나게 쓰고 싶은데, atom cpu 달린 옛날 pc중에 vs2015재배포패키지 안깔리는 놈들이 간혹 있습니다.
타겟머신이 고물pc라서 mfc로 빨리할수 있는거 winapi로 눈물흘리면서 하고, 이제라도 wxwidgets 깔아야할것 같습니다

관심 고맙습니다

Anti-Lock의 이미지

지난번 nana 는 포기하고 wx 로 가시는 건가요?ㅠㅠ

vivisection의 이미지

잘 되긴 되는데.. 아직은 좀 멀은것 같습니다

vivisection의 이미지

해결했습니다

#define UNICODE // 이놈이 모든 문제의 원흉이였습니다

이놈빼니까 문자집합 변환 잘됩니다
소스파일 인코딩은 utf-8 이고, wide, ansi 함수들 동시에 잘 작동합니다

근데 이미 사용한 수백개의 wide 함수들이 오류를 뿜습니다
전부 ansi 버전으로 바꾸거나, 인자들 전부 변환해서 집어넣거나 해야하는데..

왜 지금 아무런 감정이 없을까요..
화가 나거나 그래야 할거 같은데....

vivisection의 이미지

관련부분 바꾼것도 없는데.. 테스트용 똑같은소스, 똑같은 실행파일.. 아까는 되다가 갑자기 또 안되는군요..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.