我的问题很简单,但到目前为止我找不到解决方案:
如何在C++中将UTF8编码的string
转换为latin1编码的string
,而又不使用任何类似libiconv的库?
到目前为止,我能找到的每个示例都是将latin1转换为UTF8的?
最佳答案
typedef unsigned value_type;
template <typename Iterator>
size_t get_length (Iterator p)
{
unsigned char c = static_cast<unsigned char> (*p);
if (c < 0x80) return 1;
else if (!(c & 0x20)) return 2;
else if (!(c & 0x10)) return 3;
else if (!(c & 0x08)) return 4;
else if (!(c & 0x04)) return 5;
else return 6;
}
template <typename Iterator>
value_type get_value (Iterator p)
{
size_t len = get_length (p);
if (len == 1)
return *p;
value_type res = static_cast<unsigned char> (
*p & (0xff >> (len + 1)))
<< ((len - 1) * 6);
for (--len; len; --len)
res |= (static_cast<unsigned char> (*(++p)) - 0x80) << ((len - 1) * 6);
return res;
}
该函数将把unicode代码点返回到
p
。您现在可以使用for (std::string::iterator p = s_utf8.begin(); p != s_utf8.end(); ++p)
{
value_type value = get_value<std::string::iterator&>(p));
if (value > 0xff)
throw "AAAAAH!";
s_latin1.append(static_cast<char>(value));
}
不保证,代码已经很老了:)
关于c++ - 如何在C/C++中将字符串从UTF8转换为Latin1?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12855643/