- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
了解 unicode、语言环境、宽字符和转换对我来说是一次可怕的经历。
我需要同时阅读一个包含俄文、英文、中文和乌克兰文字符的文本文件
我的方法是以字节 block 的形式读取文件,然后在单独的线程上对 block 进行操作以实现快速读取。 (Link)
这是使用 std::ifstream.read(myChunkBuffer, chunk_byteSize)
完成的
但是,我知道如果我坚持使用 char
,我的多语言文件中的任何字符都无法通过 255 种组合来表示。
就此而言,我将所有内容都转换为 wchar_t
并希望一切顺利。
我也知道 Sys.setlocale(locale = "Russian")
(Link)但它不会将每个 字符解释为俄语吗?在解析字节时,我不知道何时在我的 4 种语言之间切换。
在 Windows 操作系统上,我可以创建一个 .txt 文件并写入“Привет!你好!”在 Notepad++ 程序中,它将保存文件并使用相同的字母重新打开。它是否以某种方式 secret 地在每个字符后添加不可见的标记,以知道何时解释为俄语,何时解释为英语?
我目前的理解是:将所有内容都作为 wchar_t
(双字节),将任何文件解释为 UTF-16(双字节)- 是否正确?
另外,我希望保持代码跨平台。
对不起菜鸟
最佳答案
好了,让我们开始吧。让我们针对从 UTF-8 编码文件中读取文本并将其转换为宽字符串而不丢失任何信息的特定问题提供实用解决方案。
一旦我们可以做到这一点,我们就应该没问题,因为这里介绍的实用函数通常会处理所有 UTF-8 到宽字符串的转换(反之亦然),而这正是您所缺少的关键。
那么,首先,您将如何读入您的数据?嗯,这很容易。因为,在一个层面上,UTF-8 字符串只是 chars
的序列,出于多种目的,您可以简单地以这种方式处理它们。所以你只需要做你会为任何文本文件做的事情,例如:
std::ifstream f;
f.open ("myfile.txt", std::ifstream::in);
if (!f.fail ())
{
std::string utf8;
f >> utf8;
// ...
}
到目前为止一切顺利。这一切看起来都很简单。
但是现在,为了更容易地处理我们刚刚读入的字符串(因为在代码中处理多字节字符串非常痛苦),我们需要将其转换为所谓的宽字符串在我们尝试用它做任何事情之前。这些实际上有几种风格(因为不确定 wchar_t
在任何特定平台上的实际“宽度”),但现在我会坚持使用 wchar_t
为了让事情变得简单,进行这种转换实际上比您想象的要容易。
所以,事不宜迟,这是您的转换函数(这就是您买票的目的):
#include <string>
#include <codecvt>
#include <locale>
std::string narrow (const std::wstring& wide_string)
{
std::wstring_convert <std::codecvt_utf8 <wchar_t>, wchar_t> convert;
return convert.to_bytes (wide_string);
}
std::wstring widen (const std::string& utf8_string)
{
std::wstring_convert <std::codecvt_utf8 <wchar_t>, wchar_t> convert;
return convert.from_bytes (utf8_string);
}
我的天,这很容易,为什么这些门票一开始就这么贵?
我想这就是我真正需要说的。我认为,根据您在问题中所说的内容,您已经对自己想要做什么有了一个清晰的认识,只是不知道如何实现它(也许还没有完全结合所有的点yet) 但以防万一有任何挥之不去的困惑,一旦你确实有一个宽字符串,你就可以自由地使用所有 std::basic_string 的方法,一切都会'只是工作'。如果您需要将其转换回 UTF-8 字符串以(比如说)将其写出到文件中,那么,现在这很简单。
测试程序超优Wandbox .稍后我会修改这个帖子,还有一些话要说。现在是早餐时间 :) 如有任何问题,请在评论中提出。
注释(作为编辑添加):
codecvt
在 C++17 中被弃用(不知道为什么),但如果您将它的使用限制在这两个函数上,那么它真的没有什么可担心的。如果出现更好的情况,人们总是可以重写这些内容(提示,提示,亲爱的标准人员)。codecvt
我相信可以处理其他字符编码,但就我而言,谁在乎呢?std::wstring
(基于 wchar_t
)不能在您的特定平台上为您剪裁,那么您始终可以使用 std::u16string
或 std::u32string
。关于c++ - 读取多语言文件 - wchar_t vs char?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51352190/
今天我在一个 Java 应用程序中看到了几种不同的加载文件的方法。 文件:/ 文件:// 文件:/// 这三个 URL 开头有什么区别?使用它们的首选方式是什么? 非常感谢 斯特凡 最佳答案 file
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我有一个 javascript 文件,并且在该方法中有一个“测试”方法,我喜欢调用 C# 函数。 c# 函数与 javascript 文件不在同一文件中。 它位于 .cs 文件中。那么我该如何管理 j
需要检查我使用的文件/目录的权限 //filePath = path of file/directory access denied by user ( in windows ) File fil
我在一个目录中有很多 java 文件,我想在我的 Intellij 项目中使用它。但是我不想每次开始一个新项目时都将 java 文件复制到我的项目中。 我知道我可以在 Visual Studio 和
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我有 3 个组件的 Twig 文件: 文件 1: {# content-here #} 文件 2: {{ title-here }} {# content-here #}
我得到了 mod_ldap.c 和 mod_authnz_ldap.c 文件。我需要使用 Linux 命令的 mod_ldap.so 和 mod_authnz_ldap.so 文件。 最佳答案 从 c
我想使用PIE在我的项目中使用 IE7。 但是我不明白的是,我只能在网络服务器上使用 .htc 文件吗? 我可以在没有网络服务器的情况下通过浏览器加载的本地页面中使用它吗? 我在 PIE 的文档中看到
我在 CI 管道中考虑这一点,我应该首先构建和测试我的应用程序,结果应该是一个 docker 镜像。 我想知道使用构建环境在构建服务器上构建然后运行测试是否更常见。也许为此使用构建脚本。最后只需将 j
using namespace std; struct WebSites { string siteName; int rank; string getSiteName() {
我是 Linux 新手,目前正在尝试使用 ginkgo USB-CAN 接口(interface) 的 API 编程功能。为了使用 C++ 对 API 进行编程,他们提供了库文件,其中包含三个带有 .
我刚学C语言,在实现一个程序时遇到了问题将 test.txt 文件作为程序的输入。 test.txt 文件的内容是: 1 30 30 40 50 60 2 40 30 50 60 60 3 30 20
如何连接两个tcpdump文件,使一个流量在文件中出现一个接一个?具体来说,我想“乘以”一个 tcpdump 文件,这样所有的 session 将一个接一个地按顺序重复几次。 最佳答案 mergeca
我有一个名为 input.MP4 的文件,它已损坏。它来自闭路电视摄像机。我什么都试过了,ffmpeg , VLC 转换,没有运气。但是,我使用了 mediainfo和 exiftool并提取以下信息
我想做什么? 我想提取 ISO 文件并编辑其中的文件,然后将其重新打包回 ISO 文件。 (正如你已经读过的) 我为什么要这样做? 我想开始修改 PSP ISO,为此我必须使用游戏资源、 Assets
给定一个 gzip 文件 Z,如果我将其解压缩为 Z',有什么办法可以重新压缩它以恢复完全相同的 gzip 文件 Z?在粗略阅读了 DEFLATE 格式后,我猜不会,因为任何给定的文件都可能在 DEF
我必须从数据库向我的邮件 ID 发送一封带有附件的邮件。 EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Adventure Works Admin
我有一个大的 M4B 文件和一个 CUE 文件。我想将其拆分为多个 M4B 文件,或将其拆分为多个 MP3 文件(以前首选)。 我想在命令行中执行此操作(OS X,但如果需要可以使用 Linux),而
快速提问。我有一个没有实现文件的类的项目。 然后在 AppDelegate 我有: #import "AppDelegate.h" #import "SomeClass.h" @interface A
我是一名优秀的程序员,十分优秀!