使用带有 _O_U8TEXT 的 setmode 处理 unicode 时 C++ 崩溃

2024-04-30

我尝试打印 unicode 的是

_setmode(_fileno(stdout), _O_U8TEXT);
string str = u8"unicode 한글 hangul";
cout << str << endl;

我使用 setmode 来正确显示和获取 unicode,但它崩溃了调试断言失败 https://i.stack.imgur.com/hpdjN.png.

However,

_setmode(_fileno(stdout), _O_U16TEXT);
wstring str = L"unicode 한글 hangul";
wcout << str << endl;

_O_U16TEXT 正确编译和打印。

我应该怎么做才能使用 UTF-8?我必须找到另一个技巧吗?


_setmode https://learn.microsoft.com/en-gb/cpp/c-runtime-library/reference/setmode提及_O_U8TEXT and _O_U16TEXT(最后),但没有详细说明他们做了什么。它确实指出这些是翻译模式.

的文档_wsopen https://learn.microsoft.com/en-gb/cpp/c-runtime-library/reference/sopen-wsopen列表(强调我的):

_O_U16TEXT
打开一个file在 Unicode UTF-16 模式下。
_O_U8TEXT
打开一个file在 Unicode UTF-8 模式下。

这意味着:当使用 unicode io 设施时(wprintf, std::wcout等),这意味着使用 unicode (UTF-16) 字符串,输出在写入文件时将被转换为 UTF-16 或 UTF-8。

尝试这个:

_setmode(_fileno(stdout), _O_U8TEXT);
std::wcout << L"unicode 한글 hangul\n";

您不应该在控制台上看到差异,但如果重定向输出:

> u8out | hexdump -C
00000000  75 6e 69 63 6f 64 65 20  ed 95 9c ea b8 80 20 68  |unicode ...... h|
00000010  61 6e 67 75 6c 0d 0a                              |angul..|
00000017

> u16out | hexdump -C
00000000  75 00 6e 00 69 00 63 00  6f 00 64 00 65 00 20 00  |u.n.i.c.o.d.e. .|
00000010  5c d5 00 ae 20 00 68 00  61 00 6e 00 67 00 75 00  |\... .h.a.n.g.u.|
00000020  6c 00 0d 00 0a 00                                 |l.....|
00000026

从理论上讲,这应该意味着您也可以使用_O_U8TEXT on stdin读取 UTF-8 输入,但实际上并不总是有效:

> u8in < u8.txt
unicode 한글 hangul €µöäüß

> u8in
unicode 한글 hangul €µöäüß
unicode ?? hangul ?攄��

_O_U16TEXT appears使用控制台输入(在我的机器上),但是您不能使用 UTF-8 编码的重定向输入/输出:

> u16in
unicode 한글 hangul €µöäüß
unicode 한글 hangul €µöäüß

您可以在这里阅读更多相关内容:

PS:这个断言告诉你的是,你can't将 unicode 输出与 ANSI 输出工具结合使用。奇怪的是,如果您不设置其中一种 unicode 模式,则不会强制执行此操作...

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

使用带有 _O_U8TEXT 的 setmode 处理 unicode 时 C++ 崩溃 的相关文章

  • MFC CList 支持复制分配吗?

    我在 MSVC 中查找了 CList 定义afxtempl h http www cppdoc com example mfc classdoc MFC AFXTEMPL H html并记录在MSDN http msdn microsoft
  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • C# 处理标准输入

    我目前正在尝试通过命令行断开与网络文件夹的连接 并使用以下代码 System Diagnostics Process process2 new System Diagnostics Process System Diagnostics Pr
  • C 中“complex”的默认类型

    根据我读过的文档 C99 和更高版本的支持float complex double complex and long double complex作为复杂类型 但是 此代码在使用时编译时不会发出警告gcc Wall Wextra inclu
  • 带有运算符语法的错误消息,但不带有函数语法的错误消息

    为什么我在调用 unary 时收到错误消息 使用运算符语法 如果我用函数语法调用它就可以了 现场演示 https godbolt org z j7AbeQ template
  • C# 编译器数字文字

    有谁知道 C 编译器数字文字修饰符的完整列表 默认情况下 声明 0 使其成为 Int32 声明 0 0 使其成为 Double 我可以在末尾使用文字修饰符 f 来确保某些内容被视为 Single 例如像这样 var x 0 x is Int
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 如何在win32中使用GetSaveFileName保存文件?

    我编写此代码是为了获取 fileName 来保存我的文件 include stdafx h include
  • 通过 C# Mailkit / Mimekit 发送电子邮件,但出现服务器证书错误

    Visual Studio 2015 中的 0 代码 1 我正在使用 Mailkit 最新版本 1 18 1 1 从我自己的电子邮件服务器发送电子邮件 2 电子邮件服务器具有不受信任的自签名证书 3 我在代码中添加了以下两行 以忽略服务器证
  • Xamarin - SignalR 挂在连接上

    我正在尝试将我的 Xamarin 应用程序连接到托管在 Azure 上的 SignalR 后端 我遇到的问题是每次我在 HubConnection 上调用 StartAsync 时 它都会挂起客户端并且请求永远不会完成 我尝试通过应用程序进
  • Resharper:IEnumerable 的可能多重枚举

    我正在使用新的 Resharper 版本 6 在我的代码中的几个地方 它给一些文本加了下划线 并警告我可能存在IEnumerable 可能的多重枚举 我理解这意味着什么 并在适当的情况下采纳了建议 但在某些情况下 我不确定这实际上是一个大问
  • 使用多线程进行矩阵乘法?

    我应该使用线程将两个矩阵相乘 有两件事 当我运行程序时 我不断得到 0 我还收到消息错误 对于每个错误 它在粗体行上显示 警告 从不兼容的指针类型传递 printMatrix 的参数1 我尝试打印输出 还要注意 第一个粗体块 这是我解决问题
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • C 语言中的 Alpha 混合 2 RGBA 颜色[重复]

    这个问题在这里已经有答案了 可能的重复 如何快速进行阿尔法混合 https stackoverflow com questions 1102692 how to do alpha blend fast 对 2 个 RGBA 整数 颜色进行
  • Linq.Select() 中的嵌套表达式方法调用

    I use Select i gt new T 每次手动点击数据库后将我的实体对象转换为 DTO 对象 以下是一些示例实体和 DTOS 用户实体 public partial class User public int Id get set
  • “必须声明标量变量”错误[重复]

    这个问题在这里已经有答案了 必须声明标量变量 Id SqlConnection con new SqlConnection connectionstring con Open SqlCommand cmd new SqlCommand cm
  • 无法识别解决方案文件夹中的 Visual Studio 2017 Nuget.config

    我在使用 Visual Studio 2017 时遇到问题 新的解决方案不断引用 C Users yopa AppData Roaming NuGet Nuget config 中意外位置的 Nuget config 文件 我已将 nuge
  • 将 Swagger 与命名空间版本的 WebApi 结合使用

    我已经找到了如何使用基于名称空间的 WebAPI 版本这个班 https aspnet codeplex com SourceControl changeset view dd207952fa86 Samples WebApi Namesp
  • SQL Server“未找到网络路径”在不同环境中随机且不频繁地发生

    类似 如果不是同一个问题 随机遇到网络路径未找到异常 https stackoverflow com questions 38696448 network path not found exception encountered rando
  • 嵌入式二进制资源 - 如何枚举嵌入的图像文件?

    我按照中的说明进行操作这本书 http www apress com book view 9781430225492 关于资源等的章节 我不太明白的是 如何替换它 images Add new BitmapImage new Uri Ima

随机推荐