как записать unicode привет мир в C на окнах

Я пытаюсь заставить это работать:


#define UNICODE
#define _UNICODE
#include 

int main()
{
    wprintf(L"Hello World!\n");
    wprintf(L"£안, 蠀, ☃!\n");
    return 0;
}

использование экспресса Visual Studio 2008 года (на Windows XP, если это имеет значение). когда я работаю, это от командной строки (запустился как cmd/u, который, как предполагается, включает unicode?) я получаю это:

C:\dev\unicodevs\unicodevs\Debug>unicodevs.exe
Hello World!
┬ú∞
C:\dev\unicodevs\unicodevs\Debug>

то, которое я предполагаю, должно было ожидаться, учитывая, что терминал не имеет шрифта для рендеринга их. но то, что получает меня, является этим, даже если я пробую это:

C:\dev\unicodevs\unicodevs\Debug>cmd /u /c "unicodevs.exe > output.txt"

произведенный файл (даже при том, что его закодированный UTF-8) похож:

Hello World!
壓

сам исходный файл определяется как unicode (закодированный в UTF-8 без BOM). выход компилятора при создании:

1>------ Rebuild All started: Project: unicodevs, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project 'unicodevs', configuration 'Debug|Win32'
1>Compiling...
1>main.c
1>.\main.c(1) : warning C4005: 'UNICODE' : macro redefinition
1>        command-line arguments :  see previous definition of 'UNICODE'
1>.\main.c(2) : warning C4005: '_UNICODE' : macro redefinition
1>        command-line arguments :  see previous definition of '_UNICODE'
1>Note: including file: C:\Program Files\Microsoft Visual Studio 9.0\VC\include\wchar.h
1>Note: including file:  C:\Program Files\Microsoft Visual Studio 9.0\VC\include\crtdefs.h
1>Note: including file:   C:\Program Files\Microsoft Visual Studio 9.0\VC\include\sal.h
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\sal.h(108) : warning C4001: nonstandard extension 'single line comment' was used
1>Note: including file:   C:\Program Files\Microsoft Visual Studio 9.0\VC\include\crtassem.h
1>Note: including file:   C:\Program Files\Microsoft Visual Studio 9.0\VC\include\vadefs.h
1>Note: including file:  C:\Program Files\Microsoft Visual Studio 9.0\VC\include\swprintf.inl
1>Note: including file:  C:\Program Files\Microsoft Visual Studio 9.0\VC\include\wtime.inl
1>Linking...
1>Embedding manifest...
1>Creating browse information file...
1>Microsoft Browse Information Maintenance Utility Version 9.00.30729
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>Build log was saved at "file://c:\dev\unicodevs\unicodevs\unicodevs\Debug\BuildLog.htm"
1>unicodevs - 0 error(s), 3 warning(s)
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

какие-либо идеи о том, что я делаю неправильно? подобные вопросы на ST (как этот: unicode привет мир для C?), кажется, обращаюсь к *, отклоняют сборки - насколько я понимаю, что setlocale () не доступен для окон.

я также пытался создать этот использующий код:: blocks/mingw gcc, но получил те же результаты.

6
задан Community 23 May 2017 в 10:27
поделиться

1 ответ

Проблема не в записи (wprintf), а в перенаправлении cmd вывода, вызывающего проблему. Вы можете попробовать протестировать, записав вместо этого непосредственно в файл. В этом случае вы можете столкнуться с тем, что блокнот (или, скорее, функция Windows API) не будет правильно угадывать и неправильно интерпретировать ваш текст как ASCII, если вы просто пишете пару слов. В этом случае вам также необходимо сначала записать символы спецификации в файл.

#include <stdio.h>
#include <wchar.h>

int main()
{
    FILE *out;
    char bom[] = "\xFF\xFE";
    wchar_t s[] = L"中文!";
    size_t c;

    out = fopen ("out.txt", "w");
    if(out == NULL)
    {
        perror("out.txt");
        return 1;
    }

    c = fwrite(bom, 1, 2, out);
    if(c != 2)
    {
        perror ("Fatal write error.");
        fclose(out);
        return 2;
    }

    c = fwrite(s, sizeof(wchar_t), wcslen(s), out);
    if(c != wcslen(s))
    {
        perror ("Fatal write error.");
        fclose(out);
        return 2;
    }

    fclose(out);

    return 0;
}
5
ответ дан 17 December 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: