尝试使用MinGW在C中输出此unicode字符☒
。我首先使用swprintf
将其放在缓冲区中,然后使用wprintf
将其写入stdout。
#include <stdio.h>
int main(int argc, char **argv)
{
wchar_t buffer[50];
wchar_t c = L'☒';
swprintf(buffer, L"The character is: %c.", c);
wprintf(buffer);
return 0;
}
Windows 8下的输出是:
角色是:。
Ɣ
等其他字符也不起作用。
我做错了什么?
答案 0 :(得分:4)
您正在使用%c
,但%c
适用于char
,即使您使用wprintf()
也是如此。使用%lc
,因为参数为whar_t
。
swprintf(buffer, L"The character is: %lc.", c);
这种错误通常应该由编译器警告捕获,但它并不总是发生。特别是,捕获此错误非常棘手,因为%c
和%lc
实际上采用int
个参数,而不是char
和wchar_t
(区别在于他们如何解释int
)。
答案 1 :(得分:2)
这对我有用:
#include <locale.h>
#include <stdio.h>
#include <wchar.h>
int main(int argc, char **argv)
{
wchar_t buffer[50];
wchar_t c = L'☒';
if (!setlocale(LC_CTYPE, "")) {
fprintf(stderr, "Cannot set locale\n");
return 1;
}
swprintf(buffer, sizeof buffer, L"The character is %lc.", c);
wprintf(buffer);
return 0;
}
我改变了什么:
wchar.h
swprintf
包含
swprintf
的第二个参数
%c
转化规范更改为%lc
setlocale
答案 2 :(得分:2)
要将Unicode(或更精确的UTF-16LE)输出到Windows控制台,您必须将文件转换模式更改为_O_U16TEXT
或_O_WTEXT
。后者包括BOM
,在这种情况下不感兴趣。
可以使用_setmode更改文件转换模式。但它需要一个文件描述符(缩写为 fd )而不是FILE *
!您可以使用_fileno从FILE *
获取相应的 fd 。
这是一个应该与MinGW及其变体一起使用的示例,以及各种Visual Studio版本。
#define _CRT_NON_CONFORMING_SWPRINTFS
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
int
main(void)
{
wchar_t buffer[50];
wchar_t c = L'Ɣ';
_setmode(_fileno(stdout), _O_U16TEXT);
swprintf(buffer, L"The character is: %c.", c);
wprintf(buffer);
return 0;
}
答案 3 :(得分:0)
此常见问题解答说明了如何在MinGW中使用UniCode /宽字符: