【问题标题】:What locale LC_CTYPE is used for Windows unicode console app?什么语言环境 LC_CTYPE 用于 Windows unicode 控制台应用程序?
【发布时间】:2018-11-09 06:22:28
【问题描述】:

在将多字节控制台应用程序转换为 Unicode 时,我遇到了一个奇怪的问题,_tcprintfWriteConsole 工作正常,但 _tprintf 打印错误的字符...

我已经追溯到使用 setlocale(LC_ALL, "C"),它使用基于 MS doc 的 1 个字节的 LC_CTYPE

C 语言环境假定所有 char 数据类型都是 1 字节,并且它们的值始终小于 256。

但是,除了LC_CTYPE 之外的所有内容我都想保留"C",但我不知道该使用什么?

我认为使用 UTF16 的全部意义在于所有字符都可用,并且无论代码页或区域设置如何,都可以正确打印。

虽然在 Unicode 应用程序中将控制台输出设置为 UTF-8 (65001)(SetConsoleCP 当然与语言环境是分开的)并且输出 UTF16 也出现了显示正确字符的问题。

无论如何,有谁知道我应该在 Windows Unicode 控制台应用程序上为 UTF16 使用 LC_CTYPE 什么值?也许就像setlocale( LC_CTYPE, "" ); 一样简单?蒂亚!!

【问题讨论】:

  • 为什么在2018年自愿使用utf16?!

标签: c utf-16 windows-console


【解决方案1】:

使用_setmode()将文件翻译模式设置为_O_U16TEXT

#include <fcntl.h>
#include <io.h>
#include <stdio.h>

int main(void)
{
    _setmode(_fileno(stdout), _O_U16TEXT);
    wprintf(L"ελληνικά\n");
}

【讨论】:

  • 有效!谢谢!实际上,我刚刚跟踪了 wprintf 调用,发现必须设置某种模式。你知道它记录在哪里吗?
  • @user3161924 我链接的 MSDN 页面中的示例代码不算作文档吗?
  • 我的 VS2008 文档没有 _setmode(),但可以。我希望文档将它放在 wprintf() 类型页面或使用 unicode 的通用页面上。如果它不存在,那很好,我只是想如果存在,它也可以提供有关其他事物的更多详细信息。
  • @user3161924 为什么在 2018 中使用 Visual Studio 2008?
猜你喜欢
  • 2011-06-23
  • 1970-01-01
  • 2014-05-03
  • 2011-06-24
  • 2018-08-09
  • 2011-10-31
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
相关资源
最近更新 更多