c - 如何在控制台窗口中显示适用于所有编译器的重音字符?



我做了一个程序,在运行过程中在屏幕上打印公交车站的名称,这些名称通常包含重音字符。我做了一个解决方案,对我和我在Visual Studio '13和'15上的朋友都很好,但是我纠正程序的老师回答说这对他不起作用。文件NULL位于包含代码的文件夹中。 我用了这个:

setlocale(LC_ALL, "");
system("chcp 1250 > NULL");
printf("Mária Terézia körútn");

我的问题:如何使程序在每个编译器和操作系统上显示重音字符?

不幸的是,没有什么适用于所有编译器,但是通过一些#if块,我们可以非常接近。 据报道,这样的代码在 tdm-gcc 上失败了。

在 C 中执行此操作的标准方法是使用标准库打印宽字符字符串。 不幸的是,如果没有一些额外的初始化,这不适用于 MSVC 运行时。 如果这样做,则无法在同一程序中的宽字符函数(如wprintf())和窄字符函数(如printf())之间来回切换。

#include <locale.h>
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
/* This has been reported not to autodetect correctly on tdm-gcc. */
#ifndef MS_STDLIB_BUGS // Allow overriding the autodetection.
#  if ( _WIN32 || _WIN64 )
#    define MS_STDLIB_BUGS 1
#  else
#    define MS_STDLIB_BUGS 0
#  endif
#endif
#if MS_STDLIB_BUGS
#  include <io.h>
#  include <fcntl.h>
#endif
void init_locale(void)
// Does magic so that wprintf() can work.
{
// Constant for fwide().
static const int wide_oriented = 1;
#if MS_STDLIB_BUGS
// Windows needs a little non-standard magic.
static const char locale_name[] = ".1200";
_setmode( _fileno(stdout), _O_WTEXT );
#else
// The correct locale name may vary by OS, e.g., "en_US.utf8".
static const char locale_name[] = "";
#endif
setlocale( LC_ALL, locale_name );
fwide( stdout, wide_oriented );
}
int main(void)
{
init_locale();
wprintf(L"Mária Terézia körútn");
return EXIT_SUCCESS;
}

为了与所有最新的编译器兼容,您必须将其保存为 带有 BOM 的 UTF-8。 (VS 2017 之前的 MSVC 版本在没有 BOM 的情况下无法读取 UTF-8,并且 clang 只能读取 UTF-8 以外的任何内容。

为了在控制台上阅读文本,您必须将字体设置为等宽 Unicode 字体,例如 Lucida 控制台。

在 Linux 上,请确保区域设置环境变量设置正确,并且它们与终端的设置匹配。

另一种方法是将控制台设置为 UTF-8(在 Windows 上,此操作的命令是chcp 65001. 在 Linux 上,它是export LANG=en_US.utf8或来自locale -a的适当等效项,并且可能是默认设置的。然后printf(u8"Mária Terézia körútn");. 请注意:UTF-8 在 Windows 上是二等公民。

为了与web(W3C,IETF)和*nix系统(Linux;BSD,Android,OSX,GCC,CLang)使用没有BOM的UTF-8(因为它是设计的)。

为了与仍在努力进行 Unicode 迁移的传统专有系统兼容,请使用带有 BOM 的 UT-8。或者承认他们还没有准备好使用 unicode 并使用传统的专有 8 位编码(有一天你需要迁移到 UTF-8,所以这只是将需要修复的代码添加到堆栈中)。

提示:使用BOM UTF-8与ASCII不兼容,从而扼杀了从8位编码到Unicode的任何轻松迁移。

我设法制定了一个简单的解决方案,似乎可以解决问题。使用此功能可以使匈牙利语的重音字符在Win7和Win10以及VS '13 '15和Code::Blocks上工作。

#include <locale.h>
#if defined(WIN32) || defined(_WIN32)
#include <windows.h>
#endif

主要:

setlocale(LC_ALL, "");
#if defined(WIN32) || defined(_WIN32)
SetConsoleCP(1250); SetConsoleOutputCP(1250);
#endif

相关内容

  • 没有找到相关文章

最新更新