我的公司使用这样的代码:
std::string(CT2CA(some_CString)).c_str()
我认为它将Unicode字符串(其类型为CString)转换为ANSI编码,此字符串用于电子邮件的主题。但是,电子邮件的标题(包括主题)表示邮件客户端应将其解码为unicode(这是原始代码的作用)。因此,一些像“äöü”这样的德国字母将无法正确显示为标题。
无论如何,我可以把这个标题放回UTF8并存储到std :: string或const char *?
我知道有很多更聪明的方法可以做到这一点,但我需要保持代码坚持原来的代码(即将标头发送为std :: string或const char *)。
提前致谢。
答案 0 :(得分:5)
笨拙:它' |'而不是'&' !
*buffer++ = 0xC0 | (c >> 6);
*buffer++ = 0x80 | (c & 0x3F);
答案 1 :(得分:3)
这听起来像是从一种编码到另一种编码的简单转换:您可以使用std::codecvt<char, char, mbstate_t>
。但是,我不知道你的实现是否带有合适的转换。从它的声音你只是尝试将ISO-Latin-1转换为Unicode。这应该是非常简单的:前128个字符映射(0到127)与UTF-8相同,后半部分方便地映射到相应的Unicode代码点,即,您只需要将相应的值编码为UTF-8。每个字符将被两个字符替换。它,我认为转换是这样的:
// Takes the next position and the end of a buffer as first two arguments and the
// character to convert from ISO-Latin-1 as third argument.
// Returns a pointer to end of the produced sequence.
char* iso_latin_1_to_utf8(char* buffer, char* end, unsigned char c) {
if (c < 128) {
if (buffer == end) { throw std::runtime_error("out of space"); }
*buffer++ = c;
}
else {
if (end - buffer < 2) { throw std::runtime_error("out of space"); }
*buffer++ = 0xC0 & (c >> 6);
*buffer++ = 0x80 & (c & 0x3f);
}
return buffer;
}