wprintf 输出奇怪的结果

问题描述 投票:0回答:0

我学到了什么:

  1. 只能使用
    print()
    wprintf()
    之一(因为stream一定不能是面向字节的.
  2. %s
    应与
    char *
    一起使用,而
    %ls
    wchar_t *
    .
  3. setlocale()
    应该在使用
    wchar_t
    之前调用,因为
    wcstombs()
    基于语言环境。
  4. wchar_t
    是多字节的(MinGW 2 bytes,gcc 4 bytes)

我在gcc上克服了困难,但是MinGW的结果太奇怪了

以汉字“你好”为例

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

int main()
{
    system("chcp 65001"); // set console to UTF-8

    // setlocale(LC_ALL, "zh_CN.UTF-8"); // usually on linux, may be effect
    // setlocale(LC_ALL, "chinese");     // according to MSDN

    printf("1 %s \n", "Hello你好");
    printf("2 %ls \n", L"Hello你好");

    wprintf(L"3 %s \n", "Hello你好");
    wprintf(L"4 %ls \n", L"Hello你好");
}

如果不指定语言环境,则输出:

Active code page: 65001
1 Hello你好
2 Hello
3 Hello你好
4 Hello

如果使用

zh_CN.UTF-8
,输出与上面相同。

setlocale(LC_ALL, "chinese")

Active code page: 65001
1 Hello
2 Hello
3 Hello浣犲ソ
4 Hello你好

在 Linux 上,每个输出都是预期的。

在 Windows 上输出很奇怪,

printf
wprintf
甚至可以一起使用(在 linux 上不可能)。我不知道如何理解这个问题。

我只是希望让我的代码既跨平台又国际化。

c utf-8 wchar-t multibyte-characters
© www.soinside.com 2019 - 2024. All rights reserved.