std :: u32string转换为/从std :: string和std :: u16string

时间:2015-07-08 19:58:01

标签: c++ linux windows c++11 unicode

我需要在不同的API /模块之间转换UTF-8,UTF-16和UTF-32,因为我知道可以选择使用C ++ 11查看新的字符串类型。

看起来我可以将stringu16stringu32string用于UTF-8,UTF-16和UTF-32。我还发现codecvt_utf8codecvt_utf16看起来能够在charchar16_tchar32_t之间进行转换,看起来更高级wstring_convert 1}}但这似乎只适用于bytes / std::string而不是大量的文档。

我是不是想以某种方式使用wstring_convert用于UTF-16↔UTF-32和UTF-8↔UTF-32案例?我只是真的找到了UTF-8到UTF-16的例子,我甚至不确定它在Linux上是正确的wchar_t通常被认为是UTF-32 ......或者直接用那些codecvt事情做一些更复杂的事情?

或者这仍然没有真正处于可用状态,我应该坚持使用8,16和32位无符号整数的现有小程序?

1 个答案:

答案 0 :(得分:17)

如果您在CppReference.com上阅读了wstring_convertcodecvt_utf8codecvt_utf16codecvt_utf8_utf16的文档,这些页面会包含一个表格,可以准确地告诉您用于各种UTF转换。

table

是的,您可以使用std::wstring_convert来促进各种UTF之间的转换。尽管名称不仅仅是std::wstring,但它实际上可以使用任何std::basic_string类型(std::stringstd::wstringstd::uXXstring都基于std::string类型上)。

  

类模板std :: wstring_convert使用单独的代码转换方面Codecvt执行字节字符串std::basic_string<Elem>和宽字符串typedef std::string u8string; u8string To_UTF8(const std::u16string &s) { std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> conv; return conv.to_bytes(s); } u8string To_UTF8(const std::u32string &s) { std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv; return conv.to_bytes(s); } std::u16string To_UTF16(const u8string &s) { std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> conv; return conv.from_bytes(s); } std::u16string To_UTF16(const std::u32string &s) { std::wstring_convert<std::codecvt_utf16<char32_t>, char32_t> conv; std::string bytes = conv.to_bytes(s); return std::u16string(reinterpret_cast<const char16_t*>(bytes.c_str()), bytes.length()/sizeof(char16_t)); } std::u32string To_UTF32(const u8string &s) { std::wstring_convert<codecvt_utf8<char32_t>, char32_t> conv; return conv.from_bytes(s); } std::u32string To_UTF32(const std::u16string &s) { const char16_t *pData = s.c_str(); std::wstring_convert<std::codecvt_utf16<char32_t>, char32_t> conv; return conv.from_bytes(reinterpret_cast<const char*>(pData), reinterpret_cast<const char*>(pData+s.length())); } 之间的转换。 std :: wstring_convert假定转换构面的所有权,并且不能使用由区域设置管理的构面。 适用于std :: wstring_convert的标准方面是用于UTF-8 / UCS2和UTF-8 / UCS4转换的std :: codecvt_utf8和用于UTF-8 / UTF-16转换的std :: codecvt_utf8_utf16

例如:

*** Settings ***
Library           re

*** Variables ***
${mailbody}   this is mail body http://www.stackoverflow.com/ foobar https://stackoverflow.com/questions/31288261/how-to-click-the-link-in-email-body-and-how-to-spot-out-the-link-using-robot-fra

*** Settings ***
Library           re

*** Variables ***
${mailbody}   this is mail body http://www.stackoverflow.com/ foobar https://stackoverflow.com/questions/31288261/how-to-click-the-link-in-email-body-and-how-to-spot-out-the-link-using-robot-fra
${url regexp}    http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+

*** Test Cases ***
Get Urls
    @{lines}=    re.findall    ${url regexp}    ${mailbody}     
    Log Many    @{lines}