【发布时间】:2020-07-25 01:29:12
【问题描述】:
项目的一部分包括类似于滚动“股票行情”的内容,其中较大的字符串“滚动”固定宽度的输出字符串。
在 Linux 上使用 C++ 11,使用拉丁字符时概念很清楚。像这样的:
std::string inputString, outputString;
for (int inIdx = 0; inIdx < inputString.size(); inIdx++)
{
// shift output one character left
for (int i = 0; i < mOutputTextWidth - 1; i++)
outputString[i] = outputString[i+1];
// Append character to end of output
if (inIdx < inputString.size())
outputString[mTextWidth] = inputString.at(inIdx);
sleep(1);
}
你会得到类似的东西:
[ ]
[ H]
[ HE]
[ HEL]
[ HELLO]
[ HELLO ]
[ HELLO ]
[ HELLO ]
我需要使这项工作适用于 UTF-8 非拉丁字符。从我所读到的,这是一个复杂的主题。特别是 std::string::at 或 [] 返回一个字符,它会在长 UTF-8 字符上中断。
在 C++ 中,这样做的正确方法是什么?
例如。日语
[ ]
[ こ]
[ こん]
[ こんば]
[ こんばん]
[ こんばんは]
[ こんばんは ]
[ こんばんは ]
(我知道字形宽度会因语言而异,没关系。我只是不知道如何操作 UTF-8 字符串)
【问题讨论】:
-
我最近发布了一个类似问题的答案here。它可能有助于理解 UTF-8 在内存中的表示方式。
-
标准 C++ 中的 UTF-8 支持是粗略的。最佳行动方案很大程度上取决于您的平台和工具集。如果你想要可移植的代码,你可能想要使用第三方库。
-
此外,如果您想要最低限度的 Unicode 支持,您别无选择,只能使用第三方库。 C++ 没有工具来确定字符串的屏幕宽度,或者检查给定字符是常规字符、零宽度、双宽度还是组合字符。
-
n. 'pronouns' m:你对第三方库有什么建议吗?