C++ wchart_t 警告:字符常量对其类型而言太长
C++ wchart_t warning: character constant too long for its type
// 更新 1:
代码块 16.01
海湾合作委员会 4.9.2
Windows10
我正在努力理解:
- wchar_t有什么用?
- char16_t和wchar_t有什么区别?
我知道 char16_t 是 gua运行teed 为 16 位大小,但在这种特殊情况下,它们的大小相同。
- 每种字符类型的正确文字是什么?
计划目标:
- 正在打印 运行ge U+0000 到 U+FFFF 中的所有 Unicode 字符。
//结束更新1
当我编译以下代码时:
#include <iostream>
int main(void)
{
std::cout << sizeof(wchar_t) << "\n";
for (wchar_t ch = u'\u0000'; ch <= u'\uffff'; ++ch)
std::wcout << " " << ch;
std::cout << "\n\n\n";
}
我收到以下警告:"character constant too long for its type" 在 for 语句的行上。
我 运行 这个程序,我得到了这个:
.
我在网上搜索了一下,所有我能找到的是 wchar_t 大小是实现定义的,但即使如此,它在我的系统上也是 2 个字节。我认为它足够大。
Q1:为什么我收到警告?
Q2:为什么输出的字符数少?我预计会有数千人。
当我 运行 这段代码时 运行 没问题:
int main(void)
{
std::cout << sizeof(char16_t) << "\n";
for (char16_t ch = u'\u0000'; ch <= u'\uffff'; ++ch)
std::wcout << " " << static_cast<char>(ch);
std::cout << "\n\n\n";
}
以下内容可能更符合预期,将从 U+0000 到 U+FFFF 的每个可打印代码点显示为 Unicode。请务必将您的控制台字体设置为 Unicode 字体。
#include <cstdlib>
#include <cwctype>
#include <locale>
#include <iostream>
#if _WIN32 || _WIN64
// Windows needs a little non-standard magic for this to work.
#include <io.h>
#include <fcntl.h>
#include <locale.h>
#endif
using std::wint_t;
using std::iswprint;
void init_locale(void)
// Does magic so that wcout can work.
{
#if _WIN32 || _WIN64
// Windows needs a little non-standard magic.
constexpr char cp_utf16le[] = ".1200";
setlocale( LC_ALL, cp_utf16le );
_setmode( _fileno(stdout), _O_WTEXT );
#else
// The correct locale name may vary by OS, e.g., "en_US.utf8".
constexpr char locale_name[] = "";
std::locale::global(std::locale(locale_name));
std::wcout.imbue(std::locale());
#endif
}
int main(void)
{
init_locale();
for ( unsigned long i = 0; i < 0x10000UL; ++i )
if (iswprint(static_cast<wint_t>(i)))
std::wcout << static_cast<wchar_t>(i);
std::wcout << std::endl;
return EXIT_SUCCESS;
}
// 更新 1:
代码块 16.01
海湾合作委员会 4.9.2
Windows10
我正在努力理解:
- wchar_t有什么用?
- char16_t和wchar_t有什么区别?
我知道 char16_t 是 gua运行teed 为 16 位大小,但在这种特殊情况下,它们的大小相同。 - 每种字符类型的正确文字是什么?
计划目标:
- 正在打印 运行ge U+0000 到 U+FFFF 中的所有 Unicode 字符。
//结束更新1
当我编译以下代码时:
#include <iostream>
int main(void)
{
std::cout << sizeof(wchar_t) << "\n";
for (wchar_t ch = u'\u0000'; ch <= u'\uffff'; ++ch)
std::wcout << " " << ch;
std::cout << "\n\n\n";
}
我收到以下警告:"character constant too long for its type" 在 for 语句的行上。
我 运行 这个程序,我得到了这个:
我在网上搜索了一下,所有我能找到的是 wchar_t 大小是实现定义的,但即使如此,它在我的系统上也是 2 个字节。我认为它足够大。
Q1:为什么我收到警告?
Q2:为什么输出的字符数少?我预计会有数千人。
当我 运行 这段代码时 运行 没问题:
int main(void)
{
std::cout << sizeof(char16_t) << "\n";
for (char16_t ch = u'\u0000'; ch <= u'\uffff'; ++ch)
std::wcout << " " << static_cast<char>(ch);
std::cout << "\n\n\n";
}
以下内容可能更符合预期,将从 U+0000 到 U+FFFF 的每个可打印代码点显示为 Unicode。请务必将您的控制台字体设置为 Unicode 字体。
#include <cstdlib>
#include <cwctype>
#include <locale>
#include <iostream>
#if _WIN32 || _WIN64
// Windows needs a little non-standard magic for this to work.
#include <io.h>
#include <fcntl.h>
#include <locale.h>
#endif
using std::wint_t;
using std::iswprint;
void init_locale(void)
// Does magic so that wcout can work.
{
#if _WIN32 || _WIN64
// Windows needs a little non-standard magic.
constexpr char cp_utf16le[] = ".1200";
setlocale( LC_ALL, cp_utf16le );
_setmode( _fileno(stdout), _O_WTEXT );
#else
// The correct locale name may vary by OS, e.g., "en_US.utf8".
constexpr char locale_name[] = "";
std::locale::global(std::locale(locale_name));
std::wcout.imbue(std::locale());
#endif
}
int main(void)
{
init_locale();
for ( unsigned long i = 0; i < 0x10000UL; ++i )
if (iswprint(static_cast<wint_t>(i)))
std::wcout << static_cast<wchar_t>(i);
std::wcout << std::endl;
return EXIT_SUCCESS;
}