强制对 fmt 中的 std::string 进行 UTF-8 处理
Posted
技术标签:
【中文标题】强制对 fmt 中的 std::string 进行 UTF-8 处理【英文标题】:Force UTF-8 handling for std::string in fmt 【发布时间】:2020-03-09 12:26:37 【问题描述】:在我的 C++17 项目中,我有一个已知包含 UTF-8 编码数据的 std::string。有什么方法可以强制 fmt 将其数据视为 UTF-8 以使其按预期工作?
fmt::print(":-^11", "あいう");
// should print "----あいう----", currently prints "-あいう-"
【问题讨论】:
我认为您需要std::u8string
在一般级别上正确处理 utf-8,这仅在 C++20 中可用。我记得 fmt 中有一些专用于 utf-8 的特殊 API,您可以使用。
你知道我在哪里可以找到这个 API 吗?当我搜索它时,我看不到任何类似的东西。
现在只能在 fmt 中使用。还要不惜一切代价避免char8_t
- 它会在 C++20 中被破坏。
【参考方案1】:
fmt 中的 UTF-8 处理最近得到了改进,您的示例现在适用于 master
分支:
#include <fmt/core.h>
int main()
fmt::print(":-^11", "あいう");
打印
----あいう----
【讨论】:
【参考方案2】:将字段宽度作为下一个参数传递并自己计算:
#include <fmt/format.h>
#include <cstring>
int main()
fmt::print(":-^", "あいう", 8 + std::strlen("あいう"));
【讨论】:
所以我认为没有办法以通用方式使用 UTF-8 字符串? 好吧,我不想回答这样的问题,因为首先“以概括的方式”是广泛的,并且正在邀请基于意见的答案,其次,因为我在 utf8 字符串方面没有太多经验,并且在 fmt 库中。我认为为处理 utf8 字符串的自定义类提供自己的fmt
重载并没有那么大的工作量。我只是想指出一个简单的解决方法。以上是关于强制对 fmt 中的 std::string 进行 UTF-8 处理的主要内容,如果未能解决你的问题,请参考以下文章