将执行字符集字符串转换为UTF-8字符串。

3
在我的程序中,我有一个包含使用“执行字符集”编码的文本的std :: string(该字符集不能保证是UTF-8或甚至US-ASCII),我想将其转换为一个包含相同文本但使用UTF-8编码的std :: string。我该怎么做?
我猜我需要一个std :: codecvt<char,char,std :: mbstate_t>字符转换器对象,但我从哪里获取一个合适的对象?我必须使用什么函数或构造函数?
我假设标准库提供了某种方法来完成这个任务(在某个地方,以某种方式),因为编译器本身必须了解UTF-8(以支持UTF-8字符串文字)和执行字符集。

我个人会寻找一些库,比如ICU。也许你可以使用更轻量级的库,就像这里提出的建议一样? - Aconcagua
@Aconcagua 如果要使用外部库,我猜你需要知道执行字符集的“名称”(或ID)。但是你怎么获取它呢? - Raedwald
操作系统相关... 我不知道任何最新的Linux/BSD发行版不使用UTF-8作为本地字符集,所以你可能不需要关心... Windows: 有一些API可以使用,我会从GetUserDefaultLCID开始搜索... 可能甚至有一个库提供了合适的API。 - Aconcagua
如何获取执行字符编码?嗯,有人必须在构建时告诉编译器。如果他们还将其构建到程序数据中,那么您就可以知道。 - Tom Blodget
2个回答

0

这是一种hacky的方法,但在我的MS VS2019中它起作用了。

#pragma execution_character_set( "utf-8" )

1
我认为直接设置编译器标志(/execution-charset:utf-8)会更好。请参阅:https://learn.microsoft.com/en-us/cpp/build/reference/execution-charset-set-execution-character-set?view=msvc-160 - Marc

0
我猜想我需要一个std::codecvt<char, char, std::mbstate_t>的字符转换器对象,但是在哪里可以获得合适的对象呢?
你只能作为基类实例(通过继承)获取std::codecvt对象,因为析构函数是受保护的。话虽如此,std::codecvt<char,char,std::mbstate_t>不是你需要的面向对象,因为它代表的是标识转换(即根本不进行转换)。
目前,在C++标准库中没有关于本地(也称执行)字符编码和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)已被弃用。 - eerorika

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接