как написать unicode hello world в C на windows
im tyring, чтобы заставить это работать:
#define UNICODE
#define _UNICODE
#include <wchar.h>
int main()
{
wprintf(L"Hello World!n");
wprintf(L"£안, 蠀, ☃!n");
return 0;
}
использование visual studio 2008 express (в windows xp, если это имеет значение). когда я запускаю это из командной строки (запускается как cmd / u, который должен включить unicode ?) я понимаю:
C:devunicodevsunicodevsDebug>unicodevs.exe Hello World! ┬ú∞ C:devunicodevsunicodevsDebug>
что, я полагаю, следовало ожидать, учитывая, что у терминала нет шрифта для их рендеринга. но что меня заводит, так это то, что даже если я попробую это:
C:devunicodevsunicodevsDebug>cmd /u /c "unicodevs.exe > output.txt"
созданный файл (даже если его кодировка UTF-8) выглядит например:
Hello World! 壓
сам исходный файл определяется как unicode (кодируется в UTF-8 без спецификации). вывод компилятора при построении:
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 FilesMicrosoft Visual Studio 9.0VCincludewchar.h 1>Note: including file: C:Program FilesMicrosoft Visual Studio 9.0VCincludecrtdefs.h 1>Note: including file: C:Program FilesMicrosoft Visual Studio 9.0VCincludesal.h 1>C:Program FilesMicrosoft Visual Studio 9.0VCincludesal.h(108) : warning C4001: nonstandard extension 'single line comment' was used 1>Note: including file: C:Program FilesMicrosoft Visual Studio 9.0VCincludecrtassem.h 1>Note: including file: C:Program FilesMicrosoft Visual Studio 9.0VCincludevadefs.h 1>Note: including file: C:Program FilesMicrosoft Visual Studio 9.0VCincludeswprintf.inl 1>Note: including file: C:Program FilesMicrosoft Visual Studio 9.0VCincludewtime.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:devunicodevsunicodevsunicodevsDebugBuildLog.htm" 1>unicodevs - 0 error(s), 3 warning(s) ========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
любые идеи о том, что я делаю не так ? похожие вопросы о ST (like this one:unicode Привет мир для C?), похоже, относятся к сборкам *nix - насколько я понимаю, setlocale () недоступен для windows.
Я также попытался построить это с помощью code:: blocks/mingw gcc, но получил то же самое результаты.
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;
}