C++字符串代码点和代码单元的任何良好解决方案
Any good solutions for C++ string code point and code unit?
在Java中,字符串有方法:
length()/charAt(), codePointCount()/codePointAt()
C++11 有std::string a = u8"很烫烫的一锅汤";
但a.size()
是 char 数组的长度,不能索引 unicode char。
字符串中的 unicode 是否有任何解决方案C++?
我通常在执行字符操作之前将UTF-8
字符串转换为宽UTF-32/UCS-2
字符串。 C++
实际上确实为我们提供了执行此操作的功能,但它们不是很用户友好,所以我在这里编写了一些更好的转换函数:
// This should convert to whatever the system wide character encoding
// is for the platform (UTF-32/Linux - UCS-2/Windows)
std::string ws_to_utf8(std::wstring const& s)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> cnv;
std::string utf8 = cnv.to_bytes(s);
if(cnv.converted() < s.size())
throw std::runtime_error("incomplete conversion");
return utf8;
}
std::wstring utf8_to_ws(std::string const& utf8)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> cnv;
std::wstring s = cnv.from_bytes(utf8);
if(cnv.converted() < utf8.size())
throw std::runtime_error("incomplete conversion");
return s;
}
int main()
{
std::string s = u8"很烫烫的一锅汤";
auto w = utf8_to_ws(s); // convert to wide (UTF-32/UCS-2)
// now we can use code-point indexes on the wide string
std::cout << s << " is " << w.size() << " characters long" << 'n';
}
输出:
很烫烫的一锅汤 is 7 characters long
如果要与UTF-32
进行转换,而不考虑平台,则可以使用以下(未经充分测试(转换例程:
std::string utf32_to_utf8(std::u32string const& utf32)
{
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> cnv;
std::string utf8 = cnv.to_bytes(utf32);
if(cnv.converted() < utf32.size())
throw std::runtime_error("incomplete conversion");
return utf8;
}
std::u32string utf8_to_utf32(std::string const& utf8)
{
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> cnv;
std::u32string utf32 = cnv.from_bytes(utf8);
if(cnv.converted() < utf8.size())
throw std::runtime_error("incomplete conversion");
return utf32;
}
注意:自C++17
std::wstring_convert
起已弃用。
但是,我仍然更喜欢使用它而不是第三方库,因为它是可移植的,它避免了外部依赖,在提供替换之前不会删除它,并且在所有情况下都可以轻松替换这些功能的实现,而无需更改使用它们的所有代码。
相关文章:
- 代码编译没有任何输出,入门程序
- 可能我知道为什么这段代码没有给出任何输出吗?
- 执行此代码时,它不显示任何输出.为什么?
- 是给定代码中的任何更改,以便我可以为问题提供正确的输出
- 我的代码中是否有任何类型的错误,因为它没有给出正确的输出
- 我觉得我放入结构中的输入代码可以压缩,关于如何在保持代码简短的同时保持数据个性化的任何建议?
- 我最近更改了编译器路径以运行 c++ 代码,但现在我无法运行任何 python 代码。我该如何解决这个问题?
- 为什么 C++ 中的分号在插入代码开头时不显示任何错误?
- 为什么我的代码在终端中没有输出任何内容.开始新行没有错误
- 为什么这段代码非常慢?任何与缓存行为有关的事情?
- 如果代码中没有连接任何插槽,是否有理由发出Qt信号?
- 这会对代码产生任何影响吗?
- 为什么当从面向任何 CPU 的 C# 项目调用此代码时,此代码会引发 System.AccessViolationExc
- 为什么<<低;和 cout<<v.begin;单独给出错误,但 cout <<(lower.begin());没有给出任何错误,并使代码易于编译
- 是否有任何编译器标志可以在下面的代码中用于报告有关 UB 的警告?
- 为什么我在链表中插入的代码没有得到任何输出?
- 代码不会处理任何异常
- 如何创建我稍后在代码中定义大小的任何数组?
- 我的递归可以吗?是否有任何破坏代码的示例?
- 我是否需要处理以下代码中的任何错误情况?