【问题标题】:Convert execution character set string to a UTF-8 string将执行字符集字符串转换为 UTF-8 字符串
【发布时间】:2018-12-05 02:11:30
【问题描述】:

在我的程序中,我有一个std::string,其中包含使用“执行字符集”(即not guaranteed to be UTF-8 or even US-ASCII)编码的文本,我想将其转换为包含相同文本但已编码的std::string使用 UTF-8。我该怎么做?

我想我需要一个std::codecvt<char, char, std::mbstate_t> 字符转换器对象,但我在哪里可以获得合适的对象?我必须使用什么函数或构造函数?

我假设标准库提供了一些方法来做到这一点(在某个地方,不知何故),因为编译器本身必须知道 UTF-8(以支持 UTF-8 字符串文字)和执行字符集。

【问题讨论】:

  • 我个人会寻找一些库,例如ICU。也许您可以使用here 提议的更轻量级的库?
  • @Aconcagua 要使用外部库,我想您需要知道执行字符集的“名称”(或 ID)。但你怎么会得到呢?
  • 依赖于操作系统...我不知道任何不使用 UTF-8 作为本机字符集的最新 linux/bsd 发行版,因此您可能不需要关心。 .. Windows:有一些 API,我会开始搜索 GetUserDefaultLCID... 甚至可能其中一个库也提供了合适的 API。
  • 如何获取执行字符编码?好吧,有人必须在构建时告诉编译器。如果他们也将其内置到程序的数据中,那么您就可以知道。

标签: c++ utf-8 character-encoding


【解决方案1】:

我想我需要一个std::codecvt<char, char, std::mbstate_t> 字符转换器对象,但我在哪里可以找到合适的对象?

您只能将std::codecvt 对象作为基类实例(通过从它继承)获得,因为析构函数是受保护的。也就是说不,std::codecvt<char, char, std::mbstate_t> 不是您需要的方面,因为它代表身份转换(即根本没有转换)。

目前,C++ 标准库没有在 native(又名执行)字符编码(又名字符集)和 UTF-8 之间进行转换的功能。因此,您可以使用 Unicode 标准自己实现转换:https://www.unicode.org/versions/Unicode11.0.0/UnicodeStandard-11.0.pdf

要使用外部库,我想您需要知道执行字符集的“名称”(或 ID)。但是你怎么得到呢?

也没有标准库函数。例如在 POSIX 系统上,您可以使用nl_langinfo(CODESET)

【讨论】:

  • 除了身份之外,还有 UTF-X 到 UTF-Y 以及原生到宽到原生的窄字符集。变化不大,所有这些都不适合有问题的工作……
  • @Aconcagua 此外,使用这些构面 (std::wstring_convert) 进行转换的功能已被弃用。
【解决方案2】:

这很 hacky,但它在 MS VS2019 中对我有用

#pragma execution_character_set( "utf-8" )

【讨论】:

猜你喜欢
  • 2014-03-07
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 2014-02-05
  • 2015-11-14
  • 1970-01-01
相关资源
最近更新 更多