我需要在不同的API /模块之间转换UTF-8,UTF-16和UTF-32,因为我知道可以选择使用C ++ 11查看新的字符串类型。
看起来我可以将string
,u16string
和u32string
用于UTF-8,UTF-16和UTF-32。我还发现codecvt_utf8
和codecvt_utf16
看起来能够在char
或char16_t
和char32_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位无符号整数的现有小程序?
答案 0 :(得分:17)
如果您在CppReference.com上阅读了wstring_convert
,codecvt_utf8
,codecvt_utf16
和codecvt_utf8_utf16
的文档,这些页面会包含一个表格,可以准确地告诉您用于各种UTF转换。
是的,您可以使用std::wstring_convert
来促进各种UTF之间的转换。尽管名称不仅仅是std::wstring
,但它实际上可以使用任何std::basic_string
类型(std::string
,std::wstring
和std::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}