【问题标题】:Force UTF-8 handling for std::string in fmt强制对 fmt 中的 std::string 进行 UTF-8 处理
【发布时间】: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 中被破坏。

标签: c++ fmt


【解决方案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 重载并没有那么大的工作量。我只是想指出一个简单的解决方法。
    猜你喜欢
    • 2016-01-21
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 2013-09-11
    • 2011-11-01
    • 2015-05-14
    相关资源
    最近更新 更多