[英]C++: how to convert ASCII or ANSI to UTF8 and stores in std::string
我的公司使用一些这样的代码:
std::string(CT2CA(some_CString)).c_str()
我相信它将 Unicode 字符串(其类型为 CString)转换为 ANSI 编码,并且该字符串用于电子邮件的主题。 但是,电子邮件的标题(包括主题)表明邮件客户端应该将其解码为 unicode(原始代码就是这样做的)。 因此,某些德语字符(如“ä ö ü”)将无法正确显示为标题。
无论如何,我可以将此标头放回 UTF8 并存储到 std::string 或 const char* 中吗?
我知道有很多更聪明的方法可以做到这一点,但我需要保持代码坚持其原始方法(即,将标头作为 std::string 或 const char* 发送)。
提前致谢。
小心:它是'|' 而不是 '&' !
*buffer++ = 0xC0 | (c >> 6);
*buffer++ = 0x80 | (c & 0x3F);
这听起来像是从一种编码到另一种编码的简单转换:您可以std::codecvt<char, char, mbstate_t>
使用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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.