libc++ 的 wchar_t 输出

2023-11-24

#include <locale>
#include <iostream>

int main()
{
    std::locale::global(std::locale("en_US.utf8"));
    std::wcout << L"Həł£ō שøяļđ\n";
    return 0;
}

这在 libstdc++(gcc 和 clang)中按预期工作,但在 libc++ 中仅打印第一个字符(恰好是 ASCII)。我在 Gentoo Linux 上使用 libcxx-0.0_p20140322 。

这是 libc++ 中的一个已知错误,还是只是我不知道如何烹饪它?

更新1.我已经尝试过

std::locale::global(std::locale("en_US.utf8"));
std::locale::global(std::locale(""));
std::setlocale(LC_ALL, "en_US.utf8");
std::setlocale(LC_ALL, "");

它们都做同样的事情。

更新 2。此处使用宽字符串文字是为了简单起见。当以任何其他方式获取字符串时(从 UTF-8 转换、从二进制文件读取,...),也会发生同样的事情


您必须显式地为输出流注入语言环境,如下所示:

std::wcout.imbue(std::locale());

这使得事情按预期进行。事实上,它是required按标准:

27.5.3.3 ios_base 函数

locale getloc() const;

4 如果没有注入语言环境,则全局 C++ 语言环境的副本 locale() 在构造时生效。

So when wcout被构造后,它会获得其中注入的初始语言环境的副本。初始语言环境是“C”。我的错误假设是,没有明确注入语言环境的流始终使用当前的全局语言环境(而不仅仅是在构建时)。仔细想想,这个假设是完全不合理的。

2021 年 6 月编辑:所以理论上来说imbue应该可以,但实际上它在 libstdc++ 中不起作用。需要设置全局区域设置才能使其工作,这可能是 libstdc++ 的一个错误。 Imbuing 可以与其他宽字符流一起使用,但不能与std::wcout.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

libc++ 的 wchar_t 输出 的相关文章

  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 为什么这个函数在额外读取内存时运行速度如此之快?

    我目前正在尝试了解 x86 64 上某些循环的性能属性 特别是我的 Intel R Core TM i3 8145U CPU 2 10GHz 处理器 具体来说 在循环体内添加一条额外的指令来读取内存几乎可以使性能提高一倍 而细节并不是特别重
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束
  • 将 C# 中的 asmx web 服务的 Soap 请求标头从 text/xml 更改为soap/xml

    我需要调用网络服务 我生成了一个代理并调用了该方法 但它一直失败 因为 API 期望标头中包含soap xml 而 Visual Studio 中生成的代理客户端则在标头中发送文本 xml 问题 是否可以更改生成的代理客户端的 Conten
  • 找出 CPU 时钟频率(每个内核、每个处理器)

    像 CPUz 这样的程序非常擅长提供有关系统的深入信息 总线速度 内存时序等 但是 是否有一种编程方法可以计算每个核心 以及每个处理器 在每个 CPU 具有多个核心的多处理器系统中 频率 而无需处理 CPU 特定信息 我正在尝试开发一个反作
  • 保存时的 NHibernate FlushMode

    我已将 NHibernate 会话上的 FlushMode 属性设置为 FlushMode Never 但是当我调用 session Save User 时 无论如何都会调用数据库 这是应该如何工作的吗 我认为在我调用 Flush 之前它不
  • .NET 6 无法解压缩大型 gzip 文本

    我必须在 NET 6 应用程序中解压缩一些 gzip 文本 但是 对于一个 20 627 个字符长的字符串 它只解压缩大约 1 3 我正在使用的代码适用于 NET 5 或 NETCore 3 1 中的该字符串以及较小的压缩字符串 publi
  • 使用 libcurl 获取 https

    我正在尝试连接到 google api 这在我的终端中运行良好 我正在这样做 curl https www googleapis com tasks v1 users me lists header Authorization Bearer
  • 如何命名泛型类的 C# 源文件

    我试图坚持通用命名约定 例如中描述的那些开发类库的设计指南 http msdn microsoft com en us library ms229042 aspx 我将每种类型放入其自己的源文件中 并且部分类将拆分为多个文件 如问题中所述部
  • 无法将类型“int”隐式转换为“ushort”:已显式转换

    我正在尝试将 int 显式转换为 Short 但收到 Cannotimplicy conversion type int to ushort ushort quotient 12 ushort channel 16 我正在使用 Net Mi
  • 为什么 Sleep() 会使后续代码减慢 40 毫秒?

    我最初是在 coderanch com 上询问这个问题的 所以如果您尝试在那里帮助我 谢谢 并且不必重复这个努力 不过 coderanch com 主要是一个 Java 社区 而且 经过一些研究 这似乎确实是一个 Windows 问题 因此
  • 点云库在 VS 2019 中不起作用,但在 VS 2017 中起作用

    我已经使用 vcpkg 安装了点云库 这也是我第一次使用 vcpkg 但经过一些重新安装后 我终于通过使用 vcpkg install pcl windows x64 命令安装点云库来工作 但仅限于 Visual Studio 2017 而
  • 当我使用并行代码时,为什么我的计算机没有显示加速?

    所以我意识到这个问题听起来很愚蠢 是的 我使用的是双核 但我尝试了两个不同的库 Grand Central Dispatch 和 OpenMP 并且当使用 clock 来对带有和不带有使平行的话 速度是一样的 根据记录 他们都使用自己的并行
  • 数字签名(PKCS#7 - 延迟签名)/自应用签名以来文档已被更改或损坏

    我已经浏览了所有类似的问题 但找不到应用 itextsharp 延迟签名的情况 基本上 我的应用程序使用以下方式签署 pdf 文档PKCS 7由远程 Web 服务创建的签名 我的应用程序向此 Web 服务发送原始文档的哈希值 添加空签名字段
  • 如何按顺序而不是并行等待 C# 任务?

    我有一组异步测试 它们在外部硬件上运行 我可以按顺序运行它们 但因为所有这些测试都有副作用 所以我希望能够重新排列它们并一遍又一遍地运行它们 当我将它们放入列表中并尝试等待每个之后 它们全部并行运行 而不是 1 个 1 个运行 我希望能够打

随机推荐