输出unicode wchar_t字符

时间:2014-07-29 22:34:15

标签: c unicode mingw

尝试使用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下的输出是:

  

角色是:。

Ɣ等其他字符也不起作用。

我做错了什么?

4 个答案:

答案 0 :(得分:4)

您正在使用%c,但%c适用于char,即使您使用wprintf()也是如此。使用%lc,因为参数为whar_t

swprintf(buffer, L"The character is: %lc.", c);

这种错误通常应该由编译器警告捕获,但它并不总是发生。特别是,捕获此错误非常棘手,因为%c%lc 实际上采用int个参数,而不是charwchar_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包含
  • 我根据C
  • 的要求将大小添加为swprintf的第二个参数
  • 我将%c转化规范更改为%lc
  • 我使用setlocale
  • 更改区域设置

答案 2 :(得分:2)

要将Unicode(或更精确的UTF-16LE)输出到Windows控制台,您必须将文件转换模式更改为_O_U16TEXT_O_WTEXT。后者包括BOM,在这种情况下不感兴趣。

可以使用_setmode更改文件转换模式。但它需要一个文件描述符(缩写为 fd )而不是FILE *!您可以使用_filenoFILE *获取相应的 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 /宽字符:

https://sourceforge.net/p/mingw-w64/wiki2/Unicode%20apps/