c++ 添加“\u”到字符串
c++ adding "\u" to string
学习c++,想办法通过在“\u”后面加上4位来显示UTF-16字符。但是,例如,如果我尝试直接添加 0000:
string temp = "\u" + "0000";
我收到错误消息:通用字符名称格式不正确。那么有没有办法让这两个组成一个Unicode字符呢?我还意识到最后四个数字的范围是 0-F,但现在我只想关注 0-9 字符。
如何用不同的字符串添加“\u”
编辑:我正在寻找 JavaScript 函数的 C++ 等价物:
String.fromCharCode()
你不能说 "\u" + "0000"
,因为转义序列的解析发生在进程的早期,在实际编译开始之前。当字符串被拼接在一起时,转义序列已经被解析并且不会再被解析。由于 \u
本身不是有效的转义序列,因此您会收到有关它的错误。
你想做的事是不可能的。 C++ 解析分为多个阶段。根据 [lex.phases],转义序列(第 5 阶段)在 之前被转义 相邻字符串文字被连接(第 6 阶段)。
您不能像这样分隔 字符串文字 。引号内的特殊序列是指示编译器在编译时插入相关 Unicode 字符的指令,因此如果将其分成两部分,它就不再被识别为指令。
要以编程方式 根据其 Unicode 代码点编号生成 UTF-16
字符,您可以使用标准库 Unicode 转换函数。不幸的是,UTF-32
(Unicode 代码点)和 UTF-16
之间没有直接转换,因此您必须通过 UTF-8
作为中间值:
// UTF-16 may contain either one or two char16_t characters so
// we return a string to potentially contain both.
///
std::u16string codepoint_to_utf16(char32_t cp)
{
// convert UTF-32 (standard unicode codepoint) to UTF-8 intermediate value
char utf8[4];
char* end_of_utf8;
{
char32_t const* from = &cp;
std::mbstate_t mbs;
std::codecvt_utf8<char32_t> ccv;
if(ccv.out(mbs, from, from + 1, from, utf8, utf8 + 4, end_of_utf8))
throw std::runtime_error("bad conversion");
}
// Now convert the UTF-8 intermediate value to UTF-16
char16_t utf16[2];
char16_t* end_of_utf16;
{
char const* from = nullptr;
std::mbstate_t mbs;
std::codecvt_utf8_utf16<char16_t> ccv;
if(ccv.in(mbs, utf8, end_of_utf8, from, utf16, utf16 + 2, end_of_utf16))
throw std::runtime_error("bad conversion");
}
return {utf16, end_of_utf16};
}
int main()
{
std::u16string s; // can hold UTF-16
// iterate through some Greek codepoint values
for(char32_t u = 0x03b1; u < 0x03c9; ++u)
{
// append the converted UTF-16 characters to our string
s += codepoint_to_utf16(u);
}
// do whatever you want with s here...
}
学习c++,想办法通过在“\u”后面加上4位来显示UTF-16字符。但是,例如,如果我尝试直接添加 0000:
string temp = "\u" + "0000";
我收到错误消息:通用字符名称格式不正确。那么有没有办法让这两个组成一个Unicode字符呢?我还意识到最后四个数字的范围是 0-F,但现在我只想关注 0-9 字符。
如何用不同的字符串添加“\u”
编辑:我正在寻找 JavaScript 函数的 C++ 等价物:
String.fromCharCode()
你不能说 "\u" + "0000"
,因为转义序列的解析发生在进程的早期,在实际编译开始之前。当字符串被拼接在一起时,转义序列已经被解析并且不会再被解析。由于 \u
本身不是有效的转义序列,因此您会收到有关它的错误。
你想做的事是不可能的。 C++ 解析分为多个阶段。根据 [lex.phases],转义序列(第 5 阶段)在 之前被转义 相邻字符串文字被连接(第 6 阶段)。
您不能像这样分隔 字符串文字 。引号内的特殊序列是指示编译器在编译时插入相关 Unicode 字符的指令,因此如果将其分成两部分,它就不再被识别为指令。
要以编程方式 根据其 Unicode 代码点编号生成 UTF-16
字符,您可以使用标准库 Unicode 转换函数。不幸的是,UTF-32
(Unicode 代码点)和 UTF-16
之间没有直接转换,因此您必须通过 UTF-8
作为中间值:
// UTF-16 may contain either one or two char16_t characters so
// we return a string to potentially contain both.
///
std::u16string codepoint_to_utf16(char32_t cp)
{
// convert UTF-32 (standard unicode codepoint) to UTF-8 intermediate value
char utf8[4];
char* end_of_utf8;
{
char32_t const* from = &cp;
std::mbstate_t mbs;
std::codecvt_utf8<char32_t> ccv;
if(ccv.out(mbs, from, from + 1, from, utf8, utf8 + 4, end_of_utf8))
throw std::runtime_error("bad conversion");
}
// Now convert the UTF-8 intermediate value to UTF-16
char16_t utf16[2];
char16_t* end_of_utf16;
{
char const* from = nullptr;
std::mbstate_t mbs;
std::codecvt_utf8_utf16<char16_t> ccv;
if(ccv.in(mbs, utf8, end_of_utf8, from, utf16, utf16 + 2, end_of_utf16))
throw std::runtime_error("bad conversion");
}
return {utf16, end_of_utf16};
}
int main()
{
std::u16string s; // can hold UTF-16
// iterate through some Greek codepoint values
for(char32_t u = 0x03b1; u < 0x03c9; ++u)
{
// append the converted UTF-16 characters to our string
s += codepoint_to_utf16(u);
}
// do whatever you want with s here...
}