强制对 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 处理的主要内容,如果未能解决你的问题,请参考以下文章

fmt std::string 显示为数字

如何仅对 std::vector 中的子集进行排序?

如何将非可变参数值传递给 fmt::format?

如何修剪 std::string?

如何在 C++ 中搜索 std::string 中的子字符串?

如何将 PKCS7_sign 结果转换为 char * 或 std::string