- 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/
我是 Mercurial 的新手,并且不知何故仍处于评估过程中,所以这四个概念对我来说有点困惑。有些被提到等同于 Git 的 Staging/Index 概念,有些甚至比 Git 的 Staging
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 6 个月前关闭。 Improve this ques
任何人都可以给我详细信息吗? 例如? #ID 是属性、特性、选择器还是 anchor ? 默认属性和默认属性是不同的东西吗? 这些都是标签还是元素? 我们将对此说些什么 这个 ..... 还有这些
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我有一个由 Javascript 填充的下拉列表。 在决定加载时显示的默认值时,我意识到以下属性显示的值完全相同: innerText innerHTML label text textContent
我可以知道每个 Exec 之间有什么区别吗? , ExecWait , ExecShell , nsExec::Exec , nsExec::ExecToLog, nsExec::ExecToStac
当您处于版本 1 和版本 2 之间时,您会如何维护您的软件? 从我的角度来看,“补丁”、“修补程序”、“维护版本”、“服务包”等术语都很模糊,根据与您交谈的对象不同,定义也不同。 您如何称呼版本之间的
我刚刚发现在 ES6 中有一个新的数学方法:Math.trunc . 我在 MDN article 中阅读了它的描述。 , 听起来像使用 |0 . 此外,>0 , &-1 , ^0也做类似的事情(感谢
我想知道我的 StackPanel 所有项目的高度。 有什么区别: Height - 获取或设置元素的建议高度。 ActualHeight - 获取该元素的渲染高度。 (只读) ExtentHeigh
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我对所有声称以某种方式阻止计算的内置 Mathematica 函数感到困惑:Unevaluated、Defer、Hold ,以及超过 6 个 Hold* 形式。 Mathematica 文档只是单独解
我什至不确定正确的术语,所以让我从我的目标开始:拥有一个简单的应用程序(“Data Doler”),它只会将大量数据从文件读取到内存中,然后提供服务将该数据切片到名为“Data Lapper”的单个多
我刚刚开始在我的项目中使用 Elasticsearch,我想像 sql 关键字一样搜索 '喜欢%' 做。 谁能解释一下 之间的区别通配符 , 前缀 , 查询字符串和 正则表达式 ? 哪个可以搜索最好性
由于我对任何主流浏览器(Firefox、Chrome、Opera)都不太满意,而且我尝试过的不太受欢迎的浏览器(近十几种)都没有,所以我决定 DIY 并制作一个网页我想要最好的浏览器。 主要目标是让它
我知道如何使用 Python 解析页面。我的问题是哪种方法是所有解析技术中最快的,其他方法的速度有多快? 我知道的解析技术有Xpath、DOM、BeautifulSoup,还有使用Python的fin
我试图从正在解析的命令行中找出哪个函数最适合将十进制、十六进制或八进制数转换为 int 最好——在不知道输入的情况下事先。 目标是使用一个函数来识别不同类型的输入并将其分配给它的整数 (int) 值,
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我们需要在我们的网站上显示酒吧、餐馆和剧院等各种场所的元信息(例如,地址、姓名)。 理想情况下,用户会输入地点名称以及邮政编码,我们会提供最接近的匹配项。 人们将哪些 API 用于类似的地理定位目的?
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我正在创建我的第一个 Web 应用程序,我真的很困惑应该使用什么技术。 我的应用程序需要看起来很严肃(像一个应用程序),它不需要很多色彩缤纷的图形界面。它只需要一个工具栏、一个标签栏、一个拆分面板(最
我是一名优秀的程序员,十分优秀!