9

我想将 wstring 转换为 UTF-8 编码,但我想使用 Linux 的内置函数。

是否有任何内置函数可以通过简单的调用wstring在 Linux 中转换或转换wchar_t*为 UTF-8 ?

例子:

wstring str = L"file_name.txt";
wstring mode = "a";
fopen([FUNCTION](str), [FUNCTION](mode)); // Simple invoke.
cout << [FUNCTION](str); // Simple invoke.
4

4 回答 4

15

如果/当您的编译器支持足够的 C++11 时,您可以使用wstring_convert

#include <iostream>
#include <codecvt>
#include <locale>
int main()
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> utf8_conv;
    std::wstring str = L"file_name.txt";
    std::cout << utf8_conv.to_bytes(str) << '\n';
}

在 Linux 上使用 clang++ 2.9/libc++ 和在 Windows 上使用 Visual Studio 2010 进行测试。

于 2011-09-26T22:14:40.190 回答
8

C++ 语言标准没有显式编码的概念。它只包含一个“系统编码”的不透明概念,它wchar_t是一个“足够大”的类型。

要将不透明系统编码转换为显式外部编码,您必须使用外部库。选择的库是iconv()(from WCHAR_Tto UTF-8),它是 Posix 的一部分,可在许多平台上使用,尽管在 Windows 上,这些WideCharToMultibyte函数保证生成 UTF8。

C++ 11std::string s = u8"Hello World: \U0010FFFF";. wstring那些已经在 UTF8 中,但除了通过我描述的方式之外,它们无法与不透明的接口交互。

有关更多背景信息,请参阅此问题。

于 2011-09-19T10:29:53.270 回答
1

如果您真正想要做的是将宽字符转换为当前语言环境,那么 wcstombs 将做您需要的事情是很合理的。

如果没有,那么您可能需要寻找 ICU、boost 或类似的。

于 2011-09-19T10:24:31.727 回答
-1

当然,Linux 上没有内置函数,因为 Linux 的名称仅指内核,与它没有任何关系。我严重怀疑gcc自带的libc有这样的功能,而且

$ man -k utf

支持这个理论。但是周围有很多好的 UTF-8 库。我个人推荐 iconv 库进行此类转换。

于 2011-09-19T10:23:53.950 回答