(w)ifstream 支持不同的编码吗

2024-01-31

当我使用 wifstream 将文本文件读取为宽字符串 (std::wstring) 时,流实现是否支持不同的编码 - 即它可以用于读取例如ASCII、UTF-8 和 UTF-16 文件?

如果没有,我该怎么办?

(我需要阅读整个文件,如果这有影响的话)


C++ 通过以下方式支持字符编码std::locale和侧面std::codecvt。总体思路是locale对象描述了系统的各个方面,这些方面可能因文化、(人类)语言而异。这几个方面又细分为facets,它们是定义如何构造本地化相关对象(包括 I/O 流)的模板参数。当你从一个istream或写信给ostream,每个字符的实际书写都会通过区域设置的方面进行过滤。这些方面不仅涵盖 Unicode 类型的编码,还涵盖各种特征,例如如何写入大数字(例如使用逗号或句点)、货币、时间、大小写以及大量其他细节。

然而,仅仅因为存在进行编码的工具并不意味着标准库实际上可以处理所有编码,也不意味着这样的代码可以简单地正确执行。即使是像你应该读入的字符大小这样的基本事情(更不用说编码部分)也是很困难的,因为wchar_t可能太小(破坏数据),也可能太大(浪费空间),以及最常见的编译器(例如 Visual C++ 和 Gnu C++)do不同之处在于它们的实施规模有多大。所以你通常需要找到外部库来进行实际的编码。

  • iconv http://www.gnu.org/software/libiconv/人们普遍认为这是正确的,但是很难找到如何将其绑定到 C++ 机制的示例。
  • jla3ep 提到 https://stackoverflow.com/questions/1274910/does-wifstream-support-different-encodings/1274989#1274989 libICU http://site.icu-project.org,这是非常彻底的,但是C++ API http://icu-project.org/apiref/icu4c/并没有尝试很好地适应标准(据我所知:您可以扫描examples http://bugs.icu-project.org/trac/browser/icu/trunk/source/samples看看你是否可以做得更好。)

我能找到的涵盖所有基础的最简单的例子来自 BoostUTF-8 codecvt 方面 http://www.boost.org/doc/libs/1_39_0/libs/serialization/doc/codecvt.html,其中有一个专门尝试编码 UTF-8 (UCS4) 以供 IO 流使用的示例。它看起来像这样,但我不建议只是逐字复制它。需要更多的挖掘来源 https://svn.boost.org/trac/boost/browser/trunk/boost/detail/utf8_codecvt_facet.hpp理解它(我不声称):

typedef wchar_t ucs4_t;

std::locale old_locale;
std::locale utf8_locale(old_locale,new utf8_codecvt_facet<ucs4_t>);

...

std::wifstream input_file("data.utf8");
input_file.imbue(utf8_locale);
ucs4_t item = 0;
while (ifs >> item) { ... }

要了解有关语言环境的更多信息,以及它们如何使用方面(包括codecvt),请看以下内容:

  • 内森·迈尔斯有一个对语言环境和方面的全面解释 http://www.cantrip.org/locale.html。迈尔斯是区域设置概念的设计者之一。他有更正式的文档 http://www.cantrip.org/lib-locales.html如果你想涉足其中。
  • Apache 的标准库实现(以前的 RogueWave 的)有一个完整的方面列表 http://stdcxx.apache.org/doc/stdlibug/24-2.html.
  • 尼古拉·约苏蒂斯C++ 标准库 http://www.josuttis.com/libbook/第 14 章专门讨论这个主题。
  • 安吉莉卡·兰格和克劳斯·克雷夫特标准 C++ IOStream 和区域设置 https://rads.stackoverflow.com/amzn/click/com/0201183951奉献了一整本书。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(w)ifstream 支持不同的编码吗 的相关文章

随机推荐

  • 将窗口固定到桌面/将窗口粘贴到桌面/“始终位于底部”窗口

    我正在 C Win32 中开发一个基本的桌面应用程序 我现在的目标是创建一个基本的 便签 应用程序固定 粘在桌面上 即始终位于桌面前面 但始终位于任何其他应用程序后面 这确实是一个个人项目 只是为了对抗我糟糕的记忆力 让我的任务 笔记始终在
  • 如何优化这个索引算法

    我的问题 无论如何 我可以加快计算速度吗 是否有更好的算法或实现可以用来计算相同的值 描述算法 我有一个复杂的索引问题 我正在努力以有效的方式解决它 目标是计算矩阵w prime使用大小相同的矩阵中的值的组合w dY and dX 的价值w
  • 在 JavaScript 中以 12 小时格式显示时间

    我想通过更改以下代码以 12 小时格式显示时间 我尝试了各种技术但没有运气 希望能从你们那里找到解决方案
  • 如何在android中解析HTML?

    我正在为 android 制作一个应用程序 该应用程序的功能之一是返回图书馆目录在线搜索的结果 应用程序需要以与应用程序的其余部分保持一致的方式显示搜索结果 这是通过自定义 HTML 表单执行的 即 需要解析搜索结果并显示有用的元素 我只是
  • CSS3动画在Android 2.2上闪烁(webkit-transform:translate(..) 同时缩放(..))

    我在 Android 上做了一些关于 CSS3 动画 使用 webkit transition 进行转换 的研究 CSS3 动画在 Webkit 中仍然是一个实验性功能 如果您尝试同时进行平移和缩放 您会发现 CSS 动画中存在一些小故障和
  • 使用最新的 csproj 格式时,Web 部署包未拾取parameters.xml

    我有一个项目正在更新以使用新的 csproj 格式 我们曾经使用以下 msbuild 参数 msbuild Logging sln p WebPublishMethod Package p PackageAsSingleFile true
  • 使用上下文的“circular_reference_handler”键代替 symfony 4.2

    我必须序列化一个对象 并且遇到了如此常见的 循环引用错误 我使用了旧的 Symfony 方法 normalizer new ObjectNormalizer Add Circular reference handler normalizer
  • 选择名称为数组字段的输入字段

    我想根据条件选择文本字段 例如 if only text field name sname than only put value in it 为此我使用了
  • Python列表直接修改

    lines absb asdjhasd sadjhj sdhjsdh asjhjhad asdasd ashjhfdj asdasd for z in lines for l in z l l split print lines 我怎样才能
  • AngularFire 更新 -> 哪里

    我在这里找不到东西 我的问题是如何更新 AngularFire 中 WHERE 子句中返回的文档 constructor private db AngularFirestore var path this db collection use
  • Windows 并发 tcp/ip 连接的最大数量是多少?

    在 NET中我已经成功尝试了以下配置
  • 如何修饰类中的方法?

    我试图在类中装饰一个方法 但 python 抛出错误 我的班级是这样的 from pageutils import formatHeader class myPage object def init self self PageName d
  • 有没有办法重命名 Keras 模型的指标和损失?

    我有一个非常大的模型 有很多损失和指标 当我做print np array self model metrics names 我明白了 loss autoencoder loss autoencoder loss autoencoder l
  • 错误类型错误:无法读取未定义的属性“长度”

    我的这部分代码有错误 img src assets gms logo png alt website icon 但是当我检查资产文件夹时 gms logo png仍然在那里并且在angular cli json 资产也在那里 路径也是正确的
  • Android/iOS OpenCV 眼睛扩张检测

    寻找有关 OpenCV 是否可以或已经用于检测 Android 或 iOS 上的眼睛扩张的意见 除了使用 OpenCV 的 EyePhone 应用程序进行眼动追踪和眨眼检测之外 我没有发现太多其他功能 在完美的条件下 我确信这是可能的 我更
  • Bootstrap 3 - 显示所有屏幕尺寸的折叠导航

    我正在使用 Bootstrap v3 我已经设置了导航栏类 这样当我的屏幕大小为移动设备大小时 导航会折叠并出现类似网格的小切换按钮 所以这可以按预期工作 我想要的是 这是所有屏幕尺寸的默认操作 也就是说 即使在桌面上 我也希望导航折叠起来
  • 如何从xslt中的java地图获取数据

    我需要从 XSLT 中的 Java 地图获取数据 我知道使用 xalan 我可以实现它 但我们依赖于通用 Transformer 这迫使我们使用 Saxon HE 我将 java 映射传递给变量并在 XSLT 中获取它 请建议我们如何实现这
  • 清除或重新创建 Ruby on Rails 数据库

    我有一个充满数据的开发 Ruby on Rails 数据库 我想删除所有内容并重建数据库 我正在考虑使用类似的东西 rake db recreate 这可能吗 我知道有两种方法可以做到这一点 这将重置您的数据库并重新加载当前架构 rake
  • 选择全日历中的整周

    我在使用 fullcalendar 插件时遇到了问题 我试图通过单击在月视图中选择整周 然后创建一个事件 换句话说 如果您单击特定周中的任何一天 该周将突出显示并创建一个事件 此后 该事件应输入我的数据库中 这是我到目前为止所拥有的
  • (w)ifstream 支持不同的编码吗

    当我使用 wifstream 将文本文件读取为宽字符串 std wstring 时 流实现是否支持不同的编码 即它可以用于读取例如ASCII UTF 8 和 UTF 16 文件 如果没有 我该怎么办 我需要阅读整个文件 如果这有影响的话 C