当你写代码时
cout << "\u2780";
编译器将\u2780转换为执行字符集中该字符的适当编码。这可能是
UTF-8,因此字符串最终有四个字节(三个用于字符,一个用于空终止符)。
如果您想在运行时生成字符,则需要找到一种方法,在运行时执行与编译器在编译时执行的相同的UTF-8转换。
C++11提供了一个方便的模板和codecvt facets,可以实现这一点,然而libstdc++,即随GCC一起提供的标准库实现,尚未实现它们(截至
GCC 4.8.0(2013-03-22))。以下展示了如何使用这些特性,但您需要使用不同的标准库实现或等待libstdc++实现它们。
#include <codecvt>
int main() {
char32_t base = U'\u2780';
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> convert;
std::cout << convert.to_bytes(base + 5) << '\n';
}
您也可以使用任何其他可用的UTF-8生成方法。例如,iconv,ICU和手动使用C++11之前的codecvt_byname facets都可以工作。(我没有展示这些的示例,因为那段代码比wstring_convert
允许的简单代码更复杂。)
如果字符数量较少,一种可行的替代方案是使用字面量创建字符串数组。
char const *special_character[] = { "\u2780", "\u2781", "\u2782",
"\u2783", "\u2784", "\u2785", "\u2786", "\u2787", "\u2788", "\u2789" };
std::cout << special_character[i] << '\n';
L
?如果可能,请发布完整的代码或sscce.org。 - pinkpanther