将字符串从UTF-8转换为ISO-8859-1
Convert string from UTF-8 to ISO-8859-1
我试图将UTF-8 string
转换为ISO-8859-1 char*
,以便在遗留代码中使用。我认为唯一的办法就是使用iconv
。
我绝对更喜欢一个完全基于string
的c++解决方案,然后在结果字符串上调用.c_str()
。
我该怎么做?代码示例,如果可能的话,请。我很好使用iconv
,如果它是唯一的解决方案,你知道。
我将根据另一个答案修改我的代码来实现Alf的建议。
std::string UTF8toISO8859_1(const char * in)
{
std::string out;
if (in == NULL)
return out;
unsigned int codepoint;
while (*in != 0)
{
unsigned char ch = static_cast<unsigned char>(*in);
if (ch <= 0x7f)
codepoint = ch;
else if (ch <= 0xbf)
codepoint = (codepoint << 6) | (ch & 0x3f);
else if (ch <= 0xdf)
codepoint = ch & 0x1f;
else if (ch <= 0xef)
codepoint = ch & 0x0f;
else
codepoint = ch & 0x07;
++in;
if (((*in & 0xc0) != 0x80) && (codepoint <= 0x10ffff))
{
if (codepoint <= 255)
{
out.append(1, static_cast<char>(codepoint));
}
else
{
// do whatever you want for out-of-bounds characters
}
}
}
return out;
}
无效的UTF-8输入导致字符丢失。
首先将UTF-8转换为32位Unicode。
则保留0到255之间的值
这些是拉丁-1代码点,对于其他值,决定是否要将其视为错误或可能替换为代码点127(我最喜欢的是ASCII"del")或问号或其他东西。
c++标准库定义了一个可以使用的std::codecvt
专门化,
template<>
codecvt<char32_t, char, mbstate_t>
c++ 11§22.4.1.4/3: “专门化codecvt <char32_t, char, mbstate_t>
在UTF-32和UTF-8编码模式
Alfs建议在c++ 11中实现
#include <string>
#include <codecvt>
#include <algorithm>
#include <iterator>
auto i = u8"H€llo Wørld";
std::wstring_convert<std::codecvt_utf8<wchar_t>> utf8;
auto wide = utf8.from_bytes(i);
std::string out;
out.reserve(wide.length());
std::transform(wide.cbegin(), wide.cend(), std::back_inserter(out),
[](const wchar_t c) { return (c <= 255) ? c : '?'; });
// out now contains "H?llo Wxf8rld"
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何使用 C++将 ISO-2022-KR 编码转换为 UTF-8 编码?
- 在 c++ 中将 ISO 日期时间转换为本地日期时间并提取时间
- 警告:ISO C++禁止将字符串常量转换为'char*' [-Wwrite-strings]
- ISO C++11 不允许从字符串转换为字符
- 警告:ISO C++禁止将静态“constexpr char*”数据成员的字符串常量转换为“char*”
- 将ISO 8859-X转换为Unicode的方法
- c 中的ASCII至ISO Latin-1转换
- 将ISO时间转换为std::chrono::time_point
- 使用 C++ 测试 Unicode 代码点是否在 ISO-8859-5 集中
- 将字符串从UTF-8转换为ISO-8859-1
- 为 ISO 8859-1 实施basic_string<无符号字符>
- ISO C++禁止在指向函数的指针和指向对象的指针之间进行转换
- 如何在c++多平台中将(char *)从ISO-8859-1转换为UTF-8
- Qt转换ISO日期到QDate