Один из способов сделать это - распечатать широкую строку.К сожалению, для этой работы Windows требуется немного нестандартной настройки.Этот код выполняет эту настройку внутри #if
блоков.
#include <locale.h>
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
/* This has been reported not to autodetect correctly on tdm-gcc. */
#ifndef MS_STDLIB_BUGS // Allow overriding the autodetection.
# if ( _WIN32 || _WIN64 )
# define MS_STDLIB_BUGS 1
# else
# define MS_STDLIB_BUGS 0
# endif
#endif
#if MS_STDLIB_BUGS
# include <io.h>
# include <fcntl.h>
#endif
void init_locale(void)
// Does magic so that wprintf() can work.
{
// Constant for fwide().
static const int wide_oriented = 1;
#if MS_STDLIB_BUGS
// Windows needs a little non-standard magic.
static const char locale_name[] = ".1200";
_setmode( _fileno(stdout), _O_WTEXT );
#else
// The correct locale name may vary by OS, e.g., "en_US.utf8".
static const char locale_name[] = "";
#endif
setlocale( LC_ALL, locale_name );
fwide( stdout, wide_oriented );
}
int main(void)
{
init_locale();
wprintf(L"μουσάων Ἑλικωνιάδων ἀρχώμεθ᾽\n");
return EXIT_SUCCESS;
}
. Этот код необходимо сохранить как UTF-8 с спецификацией, чтобы более старые версии Visual Studio могли правильно его прочитать.На вашей консоли также должен быть установлен моноширинный шрифт Unicode, такой как Lucida Console, чтобы он отображался правильно.Чтобы смешивать широкие строки со строками ASCII, стандарт определяет спецификаторы формата %ls
и %lc
равными printf()
, хотя я обнаружил, что они не работают везде.
Альтернативой является установкаконсоль в режиме UTF-8 (в Windows сделайте это с chcp 65001
.), а затем напечатайте строку UTF-8 с printf(u8"μουσάων Ἑλικωνιάδων ἀρχώμεθ᾽\n");
.UTF-8 является второсортным гражданином на Windows, но это обычно работает.Попробуйте запустить его без предварительной настройки кодовой страницы, и вы получите мусор.