我做了一个程序,在运行过程中在屏幕上打印公交车站的名称,这些名称通常包含重音字符。我做了一个解决方案,对我和我在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