我公司使用这样的代码:
std::string(CT2CA(some_CString)).c_str()
Run Code Online (Sandbox Code Playgroud)
我认为它将Unicode字符串(其类型为CString)转换为ANSI编码,此字符串用于电子邮件的主题.但是,电子邮件的标题(包括主题)表示邮件客户端应将其解码为unicode(这是原始代码的作用).因此,一些像"äöü"这样的德国字母将无法正确显示为标题.
无论如何,我可以将此标头放回UTF8并存储到std :: string或const char*?
我知道有很多更聪明的方法可以做到这一点,但我需要保持代码坚持原来的(即将头部发送为std :: string或const char*).
提前致谢.
我正在玩下面提到的代码:https: //stackoverflow.com/a/21575607/2416394因为我在使用TinyXML编写正确的utf8 xml时遇到了问题.
好吧,我需要对"带有DIAERESIS的LATIN CAPITAL LETTER U"进行编码,这Ü
要写入XML等.
以下是上述帖子中的代码:
std::string codepage_str = "Ü";
int size = MultiByteToWideChar( CP_ACP, MB_COMPOSITE, codepage_str.c_str(),
codepage_str.length(), nullptr, 0 );
std::wstring utf16_str( size, '\0' );
MultiByteToWideChar( CP_ACP, MB_COMPOSITE, codepage_str.c_str(),
codepage_str.length(), &utf16_str[ 0 ], size );
int utf8_size = WideCharToMultiByte( CP_UTF8, 0, utf16_str.c_str(),
utf16_str.length(), nullptr, 0,
nullptr, nullptr );
std::string utf8_str( utf8_size, '\0' );
WideCharToMultiByte( CP_UTF8, 0, utf16_str.c_str(),
utf16_str.length(), &utf8_str[ 0 ], utf8_size,
nullptr, nullptr );
Run Code Online (Sandbox Code Playgroud)
结果是一个std :: string,其大小为3,具有以下字节:
- utf8_str "Ü" std::basic_string<char,std::char_traits<char>,std::allocator<char> …
Run Code Online (Sandbox Code Playgroud)