如何在C++中打印指定范围的Unicode字符?
在C++中打印指定范围的Unicode字符
我想打印指定范围的Unicode字符,比如从U+00B2到U+00B5(以及其他任意范围),但不知道怎么定义可变的Unicode字符并做算术运算(比如递增)。现在我需要写出和下面这段代码等效的循环版本,请问该怎么实现?
#include <iostream> int main() { std::cout << "\u00B2" << std::endl; std::cout << "\u00B3" << std::endl; std::cout << "\u00B4" << std::endl; std::cout << "\u00B5" << std::endl; }
输出(Unicode字符):
² ³ ´ µ
实现方案
Unicode字符本质是数值编码,你可以直接用整数类型存储这些码点,通过循环遍历数值范围来输出对应字符,以下是几种实用实现方式:
1. 单字节Unicode范围(如U+0000~U+00FF)
对于这类单字节字符,直接用char类型即可:
#include <iostream> int main() { // 定义起始和结束的Unicode码点数值 const char start = 0xB2; const char end = 0xB5; for (char c = start; c <= end; ++c) { std::cout << c << std::endl; } return 0; }
2. 多字节Unicode范围(通用方案)
如果要处理超出单字节的字符,用wchar_t配合宽字符输出流wcout:
#include <iostream> #include <locale> int main() { // 设置本地化,确保宽字符能正确显示 std::locale::global(std::locale("")); const wchar_t start = 0x00B2; const wchar_t end = 0x00B5; for (wchar_t c = start; c <= end; ++c) { std::wcout << c << std::endl; } return 0; }
3. C++11及以后的标准方案(明确32位码点)
用char32_t直接对应Unicode码点值,配合u32cout使用:
#include <iostream> #include <locale> int main() { std::locale::global(std::locale("")); const char32_t start = U'\u00B2'; const char32_t end = U'\u00B5'; for (char32_t c = start; c <= end; ++c) { std::u32cout << c << std::endl; } return 0; }
核心说明
- Unicode码点可以直接用十六进制数值表示(比如
0xB2就是U+00B2的数值),直接对数值做递增/递减即可遍历范围。 - 输出前设置本地化(
std::locale::global(std::locale(""))),能避免大部分控制台Unicode字符显示乱码问题。
内容的提问来源于stack exchange,提问作者alfC
相关产品推荐
相关产品推荐

