wofstream,wcout无法输出unicode的真相

2023-11-12

之前我转载过一篇ofstream和wofstream与中文输出问题,让我初步知道如何解决这类问题。第一次我没有在意,按照文章中做的方法去做,然后程序就运行正常了。我试图去记住这些规则,但是我后来发现,太难了。以至于我在最近一次使用到 std::wofstream 类的时候,发现我无法往其中输入unicode字符。让我找了几个小时的bug,于是我今天就花了两个小时,在网上搜索资料,以及自己写一些测试工程,调试跟踪 std::wofstream 的相关函数,差不多明白了原因。下面让我用最简单的方式,让你真正理解,wofstream,wcout无法输出unicode字符的原因。

  1. 首先visual studio(也可以说微软)版本的 wofstream,wcout最终输出的字符编码都是ANSI(多字节编码,MultiByte)例如:
        std::wofstream fOut;
        fOut.open( L"你好1.txt", std::ios::trunc );
        fOut << L"徐杰" << std::endl;
        fOut.close();

    这样简短的代码,最后输出的文件编码方式是:ANSI。这也是最令我吃惊的。因为我以为 wofstream 比 ofstream 多一个 w,意思是可以直接写入unicode字符(宽字符,wide-char)。但实际上,多一个 w 只是表明其支持 unicode 文件名(或者说全路径文件名)。

  2. wofstream,wcout 在处理 unicode字符 时,必须进行内部编码转换(unicode -> ansi )。
    看完第一点之后,第二点是很自然的,因为 wofstream,wcout 最后都是要输出 ansi 的,所以必须进行字符编码转换。

  3. wofstream,wcout(或者说C++)进行编码转换的时候,需要知道将 unicode 转换到哪个国家的 ansi 编码(code page )。
    code page 的信息存放在 locale 的 codecvt 里面。 C++ 默认的 locale 中的 codecvt 没有保存任何国家的 code page。所以此时调用
        wofstream << L"徐杰"; 

  4. std::locale( std::locale(),"",std::locale::ctype )会创建当前系统环境下locale,这个locale中会保存这个系统 ansi 使用 code page。
        std::locale oNewLocale( std::locale(),"",std::locale::ctype );
        std::locale oPreviousLocale = std::locale::global( oNewLocale );
        //...文件打开,保存信息,关闭文件等操作。
        std::locale::global( oPreviousLocale );
    所以我们使用时,先将本地locale设置上去,然后用完之后,在设置回来(以免影响到其他系统的使用)。locale 类的相关用法请参考相关的C++标准。也可参考此链接:locale使用说明
知道原因之后,你可以更自如的选择使用 wofstream, ofstream, wcout, cout了。

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

wofstream,wcout无法输出unicode的真相 的相关文章

  • 为什么通过派生类对基类的引用与 :: - 运算符不明确?

    所以我想知道为什么以下钻石问题的代码片段无法编译 我知道这个问题通常是通过虚拟继承来解决的 我不是故意使用它的 该代码只是为了展示我的问题 即为什么编译器称此不明确 因此 我在 struct Base 中声明了两个成员变量 因为这两个子类
  • 编写此代码片段的有效方法是什么? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 更有效和 或更短地重写此代码以节省字节并显得不那么冗长的方法 if N 2 0 N 6 N 8 N 10 N 12 N 14 N 16 N
  • 在 C# 中使用“using”关键字避免多次处置的最佳实践

    当变量是 IDisposable 时 我们有using关键字来管理处置 但是如果我们在方法中返回值怎么办 using twice StringContent stringToStringContent string str using St
  • 元组在 VS2012 中如何工作?

    Visual Studio 2012 功能 tuples但不是可变参数模板 这是如何完成的 如何在不使用可变模板的情况下实现元组 简而言之 微软做了与之前在 NET 中实现类似元组的数据类型完全相同的事情 创建许多版本 每个版本都有固定数量
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta
  • 将设置函数(setter)标记为 constexpr 的目的是什么? [复制]

    这个问题在这里已经有答案了 我无法理解将 setter 函数标记为的目的constexpr 自 C 14 起这是允许的 我的误解来自以下情况 我使用 constexpr c tor 声明一个类 并且我将通过创建该类的 constexpr 实
  • 将日期时间转换为指定格式

    我有这个日期格式yy MM dd HH mm ss ex 12 02 21 10 56 09 问题是 当我尝试使用以下代码将其转换为不同格式时 CDate 12 02 21 10 56 09 ToString MMM dd yyyy HH
  • C# 编译器数字文字

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

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include
  • 用于连接 DataTable 上的动态列的动态 LINQ

    我目前遇到的情况不确定如何继续 我有两个从数据库填充的数据表 我还有一个可用的列名称列表 可用于将这两个数据表连接在一起 我希望编写一组 LINQ 查询 这些查询将 显示两个数据表中的行 内部联接 用于从一个数据表更新另一个数据表 显示一个
  • 使用 OleDbCommandBuilder 时访问 SQL 语法错误

    我要在 C 中使用 OleDbDataAdapter 在 Access 数据库中插入数据 但收到错误消息INSERT INTO 命令中的语法错误 BackgroundWorker worker new BackgroundWorker Ol
  • EnumDisplayDevices 与 WMI Win32_DesktopMonitor,如何检测活动监视器?

    对于我当前的 C 项目 我需要为在大量计算机上连接并处于活动状态的每个监视器检测一个唯一的字符串 研究指出了两种选择 使用 WMI 并查询 Win32 DesktopMonitor 以获取所有活动监视器 使用 PNPDeviceID 来唯一
  • 为什么 f(i = -1, i = -1) 是未定义的行为?

    我正在读关于违反评估顺序 http en cppreference com w cpp language eval order 他们举了一个令我困惑的例子 1 如果标量对象上的副作用相对于同一标量对象上的另一个副作用是无序的 则行为未定义
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • 如何在dll级别读取app.config? [复制]

    这个问题在这里已经有答案了 我在一个解决方案中有一个控制台应用程序项目和库项目 dll The 图书馆项目有 app config 文件 我在其中存储我在库中使用的一些键值对 控制台应用程序引用此 dll 我有另一个 app config
  • 在哪里可以下载没有 Visual Studio 2010 的 C# 4.0 编译器?

    我知道 CTP VS 2010 映像 但我可以只下载 NET Framework 4 0 和 C 编译器吗 AFAIK VS 2010 CTP 仅作为 VM 映像提供 我不相信 Microsoft 发布了 VS 的安装程序 其中一个绝对不适
  • 有没有办法直接在函数参数中格式化字符串而不是使用临时字符串?

    我有一个接受字符串 字符数组 作为参数的函数 void enterString char my string 当使用这个函数时 我经常发现自己想要输入格式化的字符串 我使用 sprintf 来做到这一点 然而 我每次都必须创建一个临时字符串
  • printf或iostream如何指定点后的最大位数

    字符串采用什么格式printf or iomanip我应该使用 iostream 中的运算符以以下格式打印浮点数 125 0 gt 125 125 1 gt 125 1 125 12312 gt 125 12 1 12345 gt 1 12
  • SQL Server“未找到网络路径”在不同环境中随机且不频繁地发生

    类似 如果不是同一个问题 随机遇到网络路径未找到异常 https stackoverflow com questions 38696448 network path not found exception encountered rando

随机推荐

  • 【完全开源】小安派-Cam-U 摄像头核心板

    一 概述 小安派 Cam U AiPi Cam U 是安信可开源团队专门为Ai M61 32S设计的一款开发板 支持WiFi6 BLE5 3 所搭载的Ai M61 32S 模组具有丰富的外设接口 具体包括 DVP MJPEG Dispaly
  • [4G&5G专题-120]:培训-跟小朋友聊通信

    用小孩子的语言与小朋友聊通信
  • 【算法 -- LeetCode】(025) K 个一组翻转链表

    1 题目 给你链表的头节点 head 每 k 个节点一组进行翻转 请你返回修改后的链表 k 是一个正整数 它的值小于或等于链表的长度 如果节点总数不是 k 的整数倍 那么请将最后剩余的节点保持原有顺序 你不能只是单纯的改变节点内部的值 而是
  • 什么是钩子函数

    钩子函数 钩子函数 钩子函数是在一个事件触发的时候 在系统级捕获到了他 然后做一些操作 一段用以处理系统消息的程序 钩子 就是在某个阶段给你一个做某些处理的机会 钩子函数 1 是个函数 在系统消息触发时被系统调用 2 不是用户自己触发的 钩
  • Highcharts中更新series的5种方法

    用Highcharts画图时 经常需要更新所画的图表 最常见的就是改变数据以更新图表 在Highcarts中 数据对应的参数是series 这儿就以图1的柱状图为例 列举如何更新series的5种方法 以供参考 源代码可从这儿访问 图1 1
  • 嵌入式Linux驱动开发(LCD屏幕专题)(四)

    单Buffer的缺点与改进方法 1 单Buffer的缺点 如果APP速度很慢 可以看到它在LCD上缓慢绘制图案 即使APP速度很高 LCD控制器不断从Framebuffer中读取数据来显示 而APP不断把数据写入Framebuffer 假设
  • [从零开始学DeepFaceLab-9]: 使用-命令行八大操作步骤-第6步:模型的选择与训练 - 模型选择

    目录 总体流程 步骤6 模型的选择与训练 模型选择 6 1 模型的差别 6 2 SAEHD模型的超参数
  • spring-integration-redis中分布式锁RedisLockRegistry的使用

    pom依赖
  • Java技术从零到CTO路线图

    在技术方面无论我们怎么学习 总感觉需要提升自已不知道自己处于什么水平了 但如果有清晰的指示图供参考还是非常不错的 这样我们清楚的知道我们大概处于那个阶段和水平 Java程序员 高级特性 反射 泛型 注释符 自动装箱和拆箱 枚举类 可变 参数
  • 毕业设计-基于机器油菜虫害图像识别方法研究 -YOLO

    目录 前言 课题背景和意义 实现技术思路 相关基础理论与技术 1 人工神经网络 2 卷积神经网络 3 基于卷积神经网络的目标检测识别模型 4 YOLO 系列算法 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实
  • 韩式多用动态图(甜蜜女孩)

  • 离线在Jenkins安装CoBOT安装插件

    最近在某金融客户做POC 把CoBOT安装在Jenkins上面 当前Jenkins版本没有任何插件 安装后由于是云桌面没有连接互联网或已经设置访问策略 无法进行在线安装插件 所以只能下载插件后再安装 在网络上搜索Jenkins插件 下载到两
  • 【SpringCloud】application.yml和 bootstrap.yml 区别

    1 首先yml和properties文件都是属于配置文件 功能一样 主要是区别于application和bootstrap的加载顺序 Bootstrap yml bootstrap properties 在application yml a
  • caffe问题Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type: Python

    caffe中输入层使用python时 出现问题 Check failed registry count type 1 0 vs 1 Unknown layer type Python 解决方法 在caffe目录下Makefile confi
  • va_start和va_end使用详解

    本文主要介绍va start和va end的使用及原理 介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理 1 在C中 当我们无法列出传递函数的所有实参的类型和数目时 可以用省略号指定参数表 void foo void foo par
  • 手机抓包fiddler配置及使用教程

    本文基于Fiddler4讲解基本使用 fiddler抓包原理 注意 Fiddler 是以代理web服务器的形式工作的 它使用代理地址 127 0 0 1 端口 8888 当Fiddler退出的时候它会自动注销 这样就不会影响别的 程序 不过
  • libsvm库简介及使用

    libsvm是基于支持向量机 support vector machine SVM 实现的开源库 由台湾大学林智仁 Chih Jen Lin 教授等开发 它主要用于分类 支持二分类和多分类 和回归 它的License是BSD 3 Claus
  • Terdata 基础 第三课(参数宏)

    1 宏不是ANSI标准支持的 但大部分RDBMS都支持宏 在Teradata中 在ANSI和BTET缺省模式下都可以创建和执行宏 只不过在ANSI模式下会给出警告信息 1 1 参数宏 宏中可以包含可替代值的变量 CREATE MACRO d
  • linux shell 按行循环读入文件方法

    linux shell 按行循环读入文件常用代码如下 bin bash printf n echo cat file whiel read line cat test txt while read line do echo line don
  • wofstream,wcout无法输出unicode的真相

    之前我转载过一篇ofstream和wofstream与中文输出问题 让我初步知道如何解决这类问题 第一次我没有在意 按照文章中做的方法去做 然后程序就运行正常了 我试图去记住这些规则 但是我后来发现 太难了 以至于我在最近一次使用到 std