【问题标题】:C store and print wchar_tC 存储和打印 wchar_t
【发布时间】:2015-02-11 10:03:34
【问题描述】:

我想用扩展 ascii 表中的字符存储一个字符串,并打印它们。 我试过了:

wchar_t wp[] = L"Росси́йская Акаде́мия Нау́к ";
printf("%S", wp);

我可以编译,但是当我运行它时,我的终端中实际上没有显示任何内容。

你能帮帮我吗?

编辑:回应此评论:

wprintf(L"%s", wp);

抱歉,我忘了说我只能使用 write(),就像我第一次尝试时只使用 printf

【问题讨论】:

  • 描述,“什么都没有发生”?你的代码编译了吗?它运行吗?程序的其他部分是否正常工作?
  • wprintf(L"%s", wp);
  • 之后做fflush(stdout);
  • > 描述“什么都没有发生”?我的错,我有点不精确,我可以编译但是当我运行它时,我的终端中实际上没有显示任何内容。 wprintf(L"%s", wp);抱歉,我忘了说我只能使用 write(),就像我第一次尝试时只使用 printf。

标签: c wchar-t


【解决方案1】:

如果您想要宽字符(每个 16 位)作为输出,请按照 Michael 的建议使用以下代码:

wprintf(L"%s", wp);

如果需要 utf8 输出,则必须使用 iconv() 进行两者之间的转换。请参阅question 7469296 作为起点。

【讨论】:

  • 正如我在不能使用 wprintf 之前所说的那样,我必须重新实现 printf 的 %S 选项,只有 write 和 va_arg。
  • 然后使用 iconv() 将你的宽字符串转换为 UTF-8,并使用 write() 输出它。 (假设您需要创建 UTF-8 输出)。
【解决方案2】:

您需要先调用setlocale(),然后在printf() 中使用%ls

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

int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "");
    // setlocale(LC_ALL, "C.UTF-8"); // this also works

    wchar_t wp[] = L"Росси́йская Акаде́мия Нау́к";
    printf("%ls\n", wp);

    return 0;
}

有关setlocale()的更多信息,请参阅Displaying wide chars with printf

【讨论】:

    猜你喜欢
    • 2016-10-02
    • 2021-07-15
    • 2017-04-05
    • 2020-01-24
    • 2022-11-03
    • 2021-07-07
    • 2016-05-24
    • 2020-12-24
    • 1970-01-01
    相关资源
    最近更新 更多