我想将wstring转换为UTF-8编码,但我想使用Linux的内置函数。
有没有什么内置的函数在Linux 中简单的调用将wstring
或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.
C ++语言标准没有显式编码的概念。 它只包含一个“系统编码”的不透明概念, wchar_t
是一个“足够大”的类型。
要从不透明的系统编码转换为明确的外部编码,您必须使用外部库。 选择的库可以是iconv()
(从WCHAR_T
到UTF-8
),它是Posix的一部分,可以在许多平台上使用,但在Windows上, WideCharToMultibyte
函数保证产生UTF8。
C ++ 11以std::string s = u8"Hello World: \U0010FFFF";
的形式添加新的UTF8 字面值 std::string s = u8"Hello World: \U0010FFFF";
。 那些已经在UTF8,但他们不能通过我所描述的方式与不透明的wstring
接口。
看到这个问题多一点背景。
如果/当你的编译器支持足够的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进行测试。
如果你真正想要做的是从宽字符转换到当前语言环境,那么wcstombs会做你所需要的。
如果没有,那么你可能需要看重症监护病房,提升或类似的。
当然,在Linux上没有内置的函数,因为名字Linux只引用了内核,而没有任何内容。 我严重怀疑gcc自带的libc有这样的功能,而且
$ man -k utf
支持这个理论。 但是周围有很多好的UTF-8库。 我个人推荐iconv库进行这样的转换。