Program Tip

Visual C ++ 2008에서 UTF-8 문자열 리터럴을 만드는 방법

programtip 2020. 12. 1. 19:39
반응형

Visual C ++ 2008에서 UTF-8 문자열 리터럴을 만드는 방법


VC ++ 2003에서는 소스 파일을 UTF-8로 저장하고 모든 문자열을 그대로 사용했습니다. 즉, 다음 코드는 콘솔에있는 그대로 문자열을 인쇄합니다. 소스 파일이 UTF-8로 저장된 경우 출력은 UTF-8이됩니다.

printf("Chinese (Traditional)");
printf("中国語 (繁体)");
printf("중국어 (번체)");
printf("Chinês (Tradicional)");

UTF-8 BOM을 사용하여 파일을 UTF-8 형식으로 저장했습니다. 그러나 VC2008로 컴파일하면 다음과 같은 결과가 나타납니다.

warning C4566: character represented by universal-character-name '\uC911' 
cannot be represented in the current code page (932)
warning C4566: character represented by universal-character-name '\uAD6D' 
cannot be represented in the current code page (932)
etc.

이러한 경고를 유발하는 문자가 손상되었습니다. 로케일에 맞는 것 (이 경우 932 = 일본어)은 로케일 인코딩, 즉 Shift-JIS로 변환됩니다.

VC ++ 2008이 나를 위해 컴파일하는 방법을 찾을 수 없습니다. 소스 파일에서 사용하는 로케일은 중요하지 않습니다. "내가하는 일을 알고 있으니 f $ % ## ng 내 문자열 리터럴을 변경하지 마십시오"라는 로케일이없는 것 같습니다. 특히 쓸모없는 UTF-8 의사 로케일은 작동하지 않습니다.

#pragma setlocale(".65001") 
=> error C2175: '.65001' : invalid locale

"C"도 마찬가지입니다.

#pragma setlocale("C") 
=> see warnings above (in particular locale is still 932)

VC2008은 모든 문자를 지정된 (또는 기본) 로케일로 강제 적용하며 해당 로케일은 UTF-8이 될 수 없습니다. "\ xbf \ x11 ..."과 같은 이스케이프 문자열을 사용하도록 파일을 변경하고 싶지 않습니다. 동일한 소스가 UTF-8 파일을 매우 즐겁게 처리 할 수있는 gcc를 사용하여 컴파일 되었기 때문입니다.

소스 파일의 컴파일이 문자열 리터럴을 그대로 두도록 지정하는 방법이 있습니까?

다르게 묻기 위해 소스 파일을 컴파일 할 때 VC2003과의 하위 호환성을 지정하기 위해 어떤 컴파일 플래그를 사용할 수 있습니까? 즉, 문자열 리터럴을 변경하지 말고 그대로 사용하십시오.

최신 정보

제안 해 주셔서 감사하지만 wchar를 피하고 싶습니다. 이 앱은 UTF-8로 된 문자열을 독점적으로 다루기 때문에 wchar를 사용하면 모든 문자열을 다시 UTF-8로 변환해야하므로 불필요합니다. 모든 입력, 출력 및 내부 처리는 UTF-8입니다. Linux에서와 VC2003으로 컴파일 할 때 잘 작동하는 간단한 앱입니다. VC2008로 동일한 앱을 컴파일하고 작동하게하고 싶습니다.

이를 위해서는 로컬 시스템의 로케일 (일본어, 932)로 변환하지 않으려면 VC2008이 필요합니다. VC2008이 VC2003과 역 호환되기를 원합니다. 문자열이있는 그대로, 본질적으로 불투명 한 char 배열 또는 UTF-8로 사용되는 로케일 또는 컴파일러 설정을 원합니다. 그래도 VC2003과 gcc에 갇혀있을 수 있지만 VC2008 은이 경우 너무 똑똑하려고합니다.


최신 정보:

나는 이것을 할 보장 된 방법이 없다고 결정했습니다. 아래에 제시 한 솔루션은 영어 버전 VC2003에서 작동하지만 일본어 버전 VC2003 (또는 아마도 일본어 OS)으로 컴파일 할 때 실패합니다. 어쨌든 일에 의존 할 수는 없습니다. 모든 것을 L ""문자열로 선언하는 것조차 작동하지 않았습니다 (아래에 설명 된 것처럼 gcc에서 고통 스럽습니다).

대신 총알을 깨물고 모든 텍스트를 데이터 파일로 이동하고 거기에서로드하면된다고 생각합니다. 이제 SimpleIni (크로스 플랫폼 INI 파일 라이브러리) 를 통해 INI 파일의 텍스트를 저장하고 액세스하고 있습니다. 적어도 모든 텍스트가 프로그램에서 나오기 때문에 작동한다는 보장이 있습니다.

실물:

Evan만이 문제를 이해하는 것처럼 보였기 때문에 나는 이것을 직접 대답하고 있습니다. 유니 코드가 무엇인지, wchar_t를 사용하는 방법에 대한 답변은 국제화 나 유니 코드 문자 인코딩에 대한 오해가 아니기 때문에이 문제와 관련이 없습니다. 도와 주려는 시도에 감사드립니다. 명확하지 않은 경우 사과드립니다.

문제는 다양한 플랫폼과 컴파일러에서 크로스 컴파일해야하는 소스 파일이 있다는 것입니다. 이 프로그램은 UTF-8 처리를 수행합니다. 다른 인코딩은 신경 쓰지 않습니다. 현재 gcc 및 vc2003에서 작동하는 것처럼 UTF-8로 문자열 리터럴을 갖고 싶습니다. VC2008로 어떻게합니까? (즉, 이전 버전과 호환되는 솔루션).

이것이 내가 찾은 것입니다.

gcc (v4.3.2 20081105) :

  • 문자열 리터럴은있는 그대로 사용 (원시 문자열)
  • UTF-8로 인코딩 된 소스 파일 지원
  • 소스 파일에는 UTF-8 BOM이 없어야합니다.

vc2003 :

  • 문자열 리터럴은있는 그대로 사용 (원시 문자열)
  • UTF-8로 인코딩 된 소스 파일 지원
  • 소스 파일에는 UTF-8 BOM이있을 수도 있고 없을 수도 있습니다 (중요하지 않음).

vc2005 + :

  • 문자열 리터럴은 컴파일러에 의해 마사지됩니다 (원시 문자열 없음).
  • char 문자열 리터럴은 지정된 로케일로 다시 인코딩됩니다.
  • UTF-8은 대상 로케일로 지원되지 않습니다.
  • 소스 파일에는 UTF-8 BOM이 있어야합니다.

따라서 간단한 대답은 이러한 특정 목적을 위해 VC2005 +가 손상되었으며 이전 버전과 호환되는 컴파일 경로를 제공하지 않는다는 것입니다. 유니 코드 문자열을 컴파일 된 프로그램으로 가져 오는 유일한 방법은 UTF-8 + BOM + wchar를 사용하는 것입니다. 즉, 사용시 모든 문자열을 다시 UTF-8로 변환해야합니다.

wchar를 UTF-8로 변환하는 간단한 크로스 플랫폼 방법이 없습니다. 예를 들어 wchar의 크기와 인코딩은 무엇입니까? Windows에서 UTF-16. 다른 플랫폼에서? 그건 다양하다. 자세한 내용은 ICU 프로젝트참조 하십시오.

결국 나는 다음과 같은 소스로 vc2005 + 이외의 모든 컴파일러에서 변환 비용을 피할 것이라고 결정했습니다.

#if defined(_MSC_VER) && _MSC_VER > 1310
// Visual C++ 2005 and later require the source files in UTF-8, and all strings 
// to be encoded as wchar_t otherwise the strings will be converted into the 
// local multibyte encoding and cause errors. To use a wchar_t as UTF-8, these 
// strings then need to be convert back to UTF-8. This function is just a rough 
// example of how to do this.
# define utf8(str)  ConvertToUTF8(L##str)
const char * ConvertToUTF8(const wchar_t * pStr) {
    static char szBuf[1024];
    WideCharToMultiByte(CP_UTF8, 0, pStr, -1, szBuf, sizeof(szBuf), NULL, NULL);
    return szBuf;
}
#else
// Visual C++ 2003 and gcc will use the string literals as is, so the files 
// should be saved as UTF-8. gcc requires the files to not have a UTF-8 BOM.
# define utf8(str)  str
#endif

이 코드는 단순한 예일뿐입니다. 프로덕션 사용시 다양한 방법 (스레드 안전성, 오류 검사, 버퍼 크기 검사 등)으로 정리해야합니다.

이것은 다음 코드와 같이 사용됩니다. gcc, vc2003 및 vc2008에 대한 테스트에서 깔끔하게 컴파일되고 올바르게 작동합니다.

std::string mText;
mText = utf8("Chinese (Traditional)");
mText = utf8("中国語 (繁体)");
mText = utf8("중국어 (번체)");
mText = utf8("Chinês (Tradicional)");

브로 필드,

나는 똑같은 문제가 있었고 소스 문자열을 와이드 문자로 변환하고 다시 변환 할 필요가없는 솔루션을 발견했습니다. 소스 파일을 서명 없이 UTF-8로 저장하면 VC2008은 그대로 둡니다. 내가 서명을 삭제하는 것을 알았을 때 훌륭하게 일했습니다. 요약하자면 :

유니 코드 (서명없는 UTF-8)-코드 페이지 65001, VC2008에서 c4566 경고를 표시하지 않으며 VC가 인코딩을 엉망으로 만들지 않습니다. 반면 코드 페이지 65001 (서명을 사용하는 UTF-8)은 c4566을 표시합니다. 녹이다).

도움이 되기에는 너무 늦지 않았기를 바라지 만, 해결 방법을 제거하기 위해 VC2008 앱의 속도를 높일 수 있습니다.


넓은 문자열을 사용하고 필요에 따라 UTF-8로 변환하는 것이 좋습니다. 나는 당신이 언급했듯이 문자열에 16 진수 이스케이프를 사용하는 것이 가장 좋은 방법이라고 생각합니다. 코드 포인트를 원한다고 가정하면 \uC911이렇게 할 수 있습니다.

const char *str = "\xEC\xA4\x91";

나는 이것이 잘 작동 할 것이라고 믿고, 그다지 읽기 어렵 기 때문에, 당신이 이것을한다면, 그것을 설명하기 위해 주석을 달아주십시오.


파일 / 고급 저장 옵션 / 인코딩 : "유니 코드 ( 서명없는 UTF-8 )-코드 페이지 65001"


소스 파일에 대한 Visual C ++ (2005+) COMPILER 표준 동작은 다음과 같습니다.

  • CP1252 (이 예의 경우 서유럽 코드 페이지) :
    • "Ä"C4 00
    • 'Ä'C4
    • L"Ä"00C4 0000
    • L'Ä'00C4
  • BOM이없는 UTF-8 :
    • "Ä"C3 84 00(= UTF-8)
    • 'Ä' → 경고 : 다중 문자 상수
    • "Ω"E2 84 A6 00(= UTF-8, 예상대로)
    • L"A"00C3 0084 0000(틀 렸습니다!)
    • L'Ä' → 경고 : 다중 문자 상수
    • L"Ω"00E2 0084 00A6 0000(틀 렸습니다!)
  • BOM이있는 UTF-8 :
    • "Ä"C4 00(= CP1252, 더 이상 UTF-8 없음),
    • 'Ä'C4
    • "Ω" → 오류 : CP1252로 변환 할 수 없습니다!
    • L"Ä"00C4 0000(정답)
    • L'Ä'00C4
    • L"Ω"2126 0000(정답)

C 컴파일러는 CP1252와 같은 방식으로 BOM없이 UTF-8 파일을 처리합니다. 결과적으로 컴파일러가 UTF-8 및 UTF-16 문자열을 컴파일 된 출력에 혼합하는 것은 불가능합니다! 따라서 하나의 소스 코드 파일을 결정해야합니다.

  • BOM와 UTF-8 사용 만 (즉, 항상 사용하는 UTF-16 문자열을 생성 L, 접두사)
  • 또는 BOM없이 UTF-8을 사용하고 UTF-8 문자열 만 생성합니다 (예 : L접두사를 사용하지 않음 ).
  • 7 비트 ASCII 문자는 포함되지 않으며 L접두어 를 포함하거나 포함하지 않고 사용할 수 있습니다.

독립적으로 EDITOR는 BOM이없는 UTF-8 파일을 UTF-8 파일로 자동 감지 할 수 있습니다.


댓글에서
"Visual Studio를 사용하여 C 및 C ++의 문자열에 대한 내부 표현으로 UTF-8 사용"
=> http://www.nubaria.com/en/blog/?p=289

#pragma execution_character_set("utf-8") 

Visual Studio 2008 SP1 및 다음 핫픽스가 필요합니다.

http://support.microsoft.com/kb/980263 ....


이건 어때? 문자열을 UTF-8로 인코딩 된 파일에 저장 한 다음 ASCII로 인코딩 된 C ++ 소스 파일로 전처리합니다. 16 진수 이스케이프를 사용하여 문자열 내부에 UTF-8 인코딩을 유지합니다. 문자열

"中国語 (繁体)"

로 변환됩니다

"\xE4\xB8\xAD\xE5\x9B\xBD\xE8\xAA\x9E (\xE7\xB9\x81\xE4\xBD\x93)"

물론 이것은 사람이 읽을 수 없으며 컴파일러의 문제를 피하기위한 것입니다.

C ++ 전처리기를 사용하여 변환 된 헤더 파일의 문자열을 참조하거나이 트릭을 사용하여 컴파일하기 전에 전체 UTF-8 소스를 ASCII로 변환 할 수 있습니다.


당신이 가지고있는 네이티브 인코딩에서 이식 가능한 변환은 char_traits :: widen ()을 사용하여 간단합니다.

#include <locale>
#include <string>
#include <vector>

/////////////////////////////////////////////////////////
// NativeToUtf16 - Convert a string from the native 
//                 encoding to Unicode UTF-16
// Parameters:
//   sNative (in): Input String
// Returns:        Converted string
/////////////////////////////////////////////////////////
std::wstring NativeToUtf16(const std::string &sNative)
{
  std::locale locNative;

  // The UTF-16 will never be longer than the input string
  std::vector<wchar_t> vUtf16(1+sNative.length());

  // convert
  std::use_facet< std::ctype<wchar_t> >(locNative).widen(
        sNative.c_str(), 
        sNative.c_str()+sNative.length(), 
        &vUtf16[0]);

  return std::wstring(vUtf16.begin(), vUtf16.end());
}

이론적으로 UTF-16에서 UTF-8 로의 복귀 과정은 비슷해야하지만 UTF-8 로케일이 내 시스템 (Win7의 VC10 Express)에서 제대로 작동하지 않는다는 것을 발견했습니다.

따라서 RFC 3629를 기반으로 간단한 변환기를 작성했습니다.

/////////////////////////////////////////////////////////
// Utf16ToUtf8 -   Convert a character from UTF-16 
//                 encoding to UTF-8.
//                 NB: Does not handle Surrogate pairs.
//                     Does not test for badly formed 
//                     UTF-16
// Parameters:
//   chUtf16 (in): Input char
// Returns:        UTF-8 version as a string
/////////////////////////////////////////////////////////
std::string Utf16ToUtf8(wchar_t chUtf16)
{
    // From RFC 3629
    // 0000 0000-0000 007F   0xxxxxxx
    // 0000 0080-0000 07FF   110xxxxx 10xxxxxx
    // 0000 0800-0000 FFFF   1110xxxx 10xxxxxx 10xxxxxx

    // max output length is 3 bytes (plus one for Nul)
    unsigned char szUtf8[4] = "";

    if (chUtf16 < 0x80)
    {
        szUtf8[0] = static_cast<unsigned char>(chUtf16);
    }
    else if (chUtf16 < 0x7FF)
    {
        szUtf8[0] = static_cast<unsigned char>(0xC0 | ((chUtf16>>6)&0x1F));
        szUtf8[1] = static_cast<unsigned char>(0x80 | (chUtf16&0x3F));
    }
    else
    {
        szUtf8[0] = static_cast<unsigned char>(0xE0 | ((chUtf16>>12)&0xF));
        szUtf8[1] = static_cast<unsigned char>(0x80 | ((chUtf16>>6)&0x3F));
        szUtf8[2] = static_cast<unsigned char>(0x80 | (chUtf16&0x3F));
    }

    return reinterpret_cast<char *>(szUtf8);
}


/////////////////////////////////////////////////////////
// Utf16ToUtf8 -   Convert a string from UTF-16 encoding
//                 to UTF-8
// Parameters:
//   sNative (in): Input String
// Returns:        Converted string
/////////////////////////////////////////////////////////
std::string Utf16ToUtf8(const std::wstring &sUtf16)
{
    std::string sUtf8;
    std::wstring::const_iterator itr;

    for (itr=sUtf16.begin(); itr!=sUtf16.end(); ++itr)
        sUtf8 += Utf16ToUtf8(*itr);
    return sUtf8;
}

나는 이것이 모든 플랫폼에서 작동한다고 생각하지만 내 시스템을 제외하고는 테스트 할 수 없었기 때문에 버그가있을 수 있습니다.

#include <iostream>
#include <fstream>

int main()
{
    const char szTest[] = "Das tausendschöne Jungfräulein,\n"
                          "Das tausendschöne Herzelein,\n"
                          "Wollte Gott, wollte Gott,\n"
                          "ich wär' heute bei ihr!\n";

    std::wstring sUtf16 = NativeToUtf16(szTest);
    std::string  sUtf8  = Utf16ToUtf8(sUtf16);

    std::ofstream ofs("test.txt");
    if (ofs)
        ofs << sUtf8;
    return 0;
}

실험을 시도해보십시오.

#pragma setlocale(".UTF-8")

또는:

#pragma setlocale("english_england.UTF-8")

비슷한 문제가있었습니다. 내 UTF-8 문자열 리터럴은 컴파일 중에 현재 시스템 코드 페이지로 변환되었습니다. 방금 16 진 뷰어에서 .obj 파일을 열었고 이미 엉망이되었습니다. 예를 들어, 문자 ć 는 단지 1 바이트였습니다.

나를위한 해결책은 BOM없이 UTF-8로 저장하는 것이 었습니다. 그것이 내가 컴파일러를 속인 방법입니다. 이제는 그것이 정상적인 소스라고 생각하고 문자열을 번역하지 않습니다. .obj 파일에서 ć 는 이제 2 바이트입니다.

일부 해설자는 무시하십시오. 나는 당신이 원하는 것을 이해합니다. UTF-8 소스, UTF-8 생성 파일, UTF-8 입력 파일, 번역하지 않고 통신 회선을 통한 UTF-8도 마찬가지입니다.

아마도 이것이 도움이 될 것입니다 ...


나는 내가 파티에 늦다는 것을 알고 있지만 이것을 퍼뜨릴 필요가 있다고 생각 한다 . Visual C ++ 2005 이상에서 소스 파일에 BOM (바이트 순서 표시)이없고 시스템 로캘이 영어가 아닌 경우 VC는 소스 파일이 유니 코드가 아닌 것으로 간주합니다.

UTF-8 소스 파일을 올바르게 컴파일하려면 BOM 인코딩 없이 UTF-8로 저장 해야 하며 시스템 로케일 (비 유니 코드 언어)은 영어 여야합니다 .

여기에 이미지 설명 입력


비슷한 문제가 있었는데 해결책은 고급 저장 옵션을 사용하여 UTF8로 저장하는 것이 었습니다.


따라서 변경해야 할 것입니다. 이제 해결책이 생겼습니다.

우선, cl.exe가 코드를 혼란스럽게 만들지 않도록 영어와 같은 단일 바이트 코드 페이지 로컬에서 실행해야합니다.

둘째, 소스 코드를 UTF8-NO BOM에 저장하고, NO-BOM을 확인한 다음 cl.exe로 컴파일하고 printf wprint와 같은 C API를 호출하지 마십시오. 모든 직원이 작동하지 않습니다. t 이유를 알 수 있습니다 :) .... 나중에 연구가있을 수 있습니다 ...

그런 다음 컴파일하고 실행하면 결과가 표시됩니다 ..... 제 이메일은 뤄 용강입니다.

wscript :

#! /usr/bin/env python
# encoding: utf-8
# Yonggang Luo

# the following two variables are used by the target "waf dist"
VERSION='0.0.1'
APPNAME='cc_test'

top = '.'

import waflib.Configure

def options(opt):
    opt.load('compiler_c')

def configure(conf):
    conf.load('compiler_c')
    conf.check_lib_msvc('gdi32')
    conf.check_libs_msvc('kernel32 user32')

def build(bld):
    bld.program(
        features = 'c',
        source   = 'chinese-utf8-no-bom.c',
        includes = '. ..',
        cflags   = ['/wd4819'],
        target   = 'myprogram',
        use      = 'KERNEL32 USER32 GDI32')

run.bat 스크립트 실행

rd /s /q build
waf configure build --msvc_version "msvc 6.0"
build\myprogram

rd /s /q build
waf configure build --msvc_version "msvc 9.0"
build\myprogram

rd /s /q build
waf configure build --msvc_version "msvc 10.0"
build\myprogram

소스 코드 main.c :

//encoding : utf8 no-bom
#include <stdio.h>
#include <string.h>

#include <Windows.h>

char* ConvertFromUtf16ToUtf8(const wchar_t *wstr)
{
    int requiredSize = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, 0, 0, 0, 0);
    if(requiredSize > 0)
    {
        char *buffer = malloc(requiredSize + 1);
        buffer[requiredSize] = 0;
        WideCharToMultiByte(CP_UTF8, 0, wstr, -1, buffer, requiredSize, 0, 0);
        return buffer;
    }
    return NULL;
}

wchar_t* ConvertFromUtf8ToUtf16(const char *cstr)
{
    int requiredSize = MultiByteToWideChar(CP_UTF8, 0, cstr, -1, 0, 0);
    if(requiredSize > 0)
    {
        wchar_t *buffer = malloc( (requiredSize + 1) * sizeof(wchar_t) );
        printf("converted size is %d 0x%x\n", requiredSize, buffer);
        buffer[requiredSize] = 0;
        MultiByteToWideChar(CP_UTF8, 0, cstr, -1, buffer, requiredSize);
        printf("Finished\n");
        return buffer;
    }
    printf("Convert failed\n");
    return NULL;
}

void ShowUtf8LiteralString(char const *name, char const *str)
{
    int i = 0;
    wchar_t *name_w = ConvertFromUtf8ToUtf16(name);
    wchar_t *str_w = ConvertFromUtf8ToUtf16(str);

    printf("UTF8 sequence\n");
    for (i = 0; i < strlen(str); ++i)
    {
        printf("%02x ", (unsigned char)str[i]);
    }

    printf("\nUTF16 sequence\n");
    for (i = 0; i < wcslen(str_w); ++i)
    {
        printf("%04x ", str_w[i]);
    }

    //Why not using printf or wprintf? Just because they do not working:)
    MessageBoxW(NULL, str_w, name_w, MB_OK);
    free(name_w);
    free(str_w);

}

int main()
{
    ShowUtf8LiteralString("English english_c", "Chinese (Traditional)");
    ShowUtf8LiteralString("简体 s_chinese_c", "你好世界");
    ShowUtf8LiteralString("繁体 t_chinese_c", "中国語 (繁体)");
    ShowUtf8LiteralString("Korea korea_c", "중국어 (번체)");
    ShowUtf8LiteralString("What? what_c", "Chinês (Tradicional)");
}

UTF-8 소스 파일

  • BOM없이 : 시스템이> 1byte / char 코드 페이지 (Shift JIS와 같은)를 사용하는 경우를 제외하고는 원시로 처리됩니다. 시스템 코드 페이지를 1 바이트로 변경해야하며 리터럴 내에서 유니 코드 문자를 사용하고 문제없이 컴파일 할 수 있어야합니다 (적어도 희망합니다).
  • With BOM: have they char and string literals converted to system codepage during compilation. You can check current system codepage with GetACP(). AFAIK, there is no way to set system codepage to 65001 (UTF-8), so consequently there is no way to use UTF-8 directly with BOM.

The only portable and compiler independent way is to use ASCII charset and escape sequences, because there are no guarantees that any compiler would accept UTF-8 encoded file.


I had a similar problem compiling UTF-8 narrow (char) string literals and what I discovered is basically I had to have both a UTF-8 BOM and #pragma execution_character_set("utf-8")[1], or neither the BOM nor the pragma [2]. Using one without the other resulted in an incorrect conversion.

I documented the details at https://github.com/jay/compiler_string_test

[1]: Visual Studio 2012 doesn't support execution_character_set. Visual Studio 2010 and 2015 it works fine, and as you know with the patch in 2008 it works fine.

[2]: Some comments in this thread have noted that using neither the BOM nor the pragma may result in an incorrect conversion for developers using a local codepage that is multibyte (eg Japan).


I agree with Theo Vosse. Read the article The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) on Joel On Software ...


기사를 읽으십시오. 첫째, UTF-8을 원하지 않습니다. UTF-8은 문자를 나타내는 방법 일뿐입니다. 와이드 문자 (wchar_t)를 원합니다. L "yourtextgoeshere"로 기록합니다. 해당 리터럴의 유형은 wchar_t *입니다. 서두르면 wprintf를 찾으십시오.

참고 URL : https://stackoverflow.com/questions/688760/how-to-create-a-utf-8-string-literal-in-visual-c-2008

반응형