如何使用标准c++将UTF-8转换为ANSI
How to convert from UTF-8 to ANSI using standard c++
我从数据库中读取了一些字符串,这些字符串以char*和UTF-8格式存储(您知道,"á"编码为0xC3 0xA1)。但是,为了将它们写入一个文件,我首先需要将它们转换为ANSI(无法将文件转换为UTF-8格式……它只能读作ANSI),这样我的"á"就不会变成"â"。是的,我知道一些数据会丢失(中文字符,以及通常ANSI代码页中没有的任何数据),但这正是我所需要的。
但问题是,我需要在各种平台上编译代码,所以它必须是标准的C++(即没有Winapi,只有stdlib、stl、crt或任何具有可用源代码的自定义库)。
有人有什么建议吗?
几天前,有人回答说,如果我有一个C++11编译器,我可以试试这个:
#include <string>
#include <codecvt>
#include <locale>
string utf8_to_string(const char *utf8str, const locale& loc)
{
// UTF-8 to wstring
wstring_convert<codecvt_utf8<wchar_t>> wconv;
wstring wstr = wconv.from_bytes(utf8str);
// wstring to string
vector<char> buf(wstr.size());
use_facet<ctype<wchar_t>>(loc).narrow(wstr.data(), wstr.data() + wstr.size(), '?', buf.data());
return string(buf.data(), buf.size());
}
int main(int argc, char* argv[])
{
string ansi;
char utf8txt[] = {0xc3, 0xa1, 0};
// I guess you want to use Windows-1252 encoding...
ansi = utf8_to_string(utf8txt, locale(".1252"));
// Now do something with the string
return 0;
}
不知道回复发生了什么,显然有人删除了它。但是,事实证明这是一个完美的解决方案。对于发帖的人,非常感谢,你值得AC和投票!!
如果你指的是ASCII,只需丢弃任何设置了位7的字节,这将删除所有多字节序列。请注意,您可以创建更高级的算法,比如从"á"中删除重音,但这需要做更多的工作。
这应该有效:
#include <string>
#include <codecvt>
using namespace std::string_literals;
std::string to_utf8(const std::string& str, const std::locale& loc = std::locale{}) {
using wcvt = std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t>;
std::u32string wstr(str.size(), U' ');
std::use_facet<std::ctype<char32_t>>(loc).widen(str.data(), str.data() + str.size(), &wstr[0]);
return wcvt{}.to_bytes(wstr.data(),wstr.data() + wstr.size());
}
std::string from_utf8(const std::string& str, const std::locale& loc = std::locale{}) {
using wcvt = std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t>;
auto wstr = wcvt{}.from_bytes(str);
std::string result(wstr.size(), '0');
std::use_facet<std::ctype<char32_t>>(loc).narrow(wstr.data(), wstr.data() + wstr.size(), '?', &result[0]);
return result;
}
int main() {
auto s0 = u8"Blöde C++ Scheiße äöü!!1Elf"s;
auto s1 = from_utf8(s0);
auto s2 = to_utf8(s1);
return 0;
}
对于VC++:
#include <string>
#include <codecvt>
using namespace std::string_literals;
std::string to_utf8(const std::string& str, const std::locale& loc = std::locale{}) {
using wcvt = std::wstring_convert<std::codecvt_utf8<int32_t>, int32_t>;
std::u32string wstr(str.size(), U' ');
std::use_facet<std::ctype<char32_t>>(loc).widen(str.data(), str.data() + str.size(), &wstr[0]);
return wcvt{}.to_bytes(
reinterpret_cast<const int32_t*>(wstr.data()),
reinterpret_cast<const int32_t*>(wstr.data() + wstr.size())
);
}
std::string from_utf8(const std::string& str, const std::locale& loc = std::locale{}) {
using wcvt = std::wstring_convert<std::codecvt_utf8<int32_t>, int32_t>;
auto wstr = wcvt{}.from_bytes(str);
std::string result(wstr.size(), '0');
std::use_facet<std::ctype<char32_t>>(loc).narrow(
reinterpret_cast<const char32_t*>(wstr.data()),
reinterpret_cast<const char32_t*>(wstr.data() + wstr.size()),
'?', &result[0]);
return result;
}
int main() {
auto s0 = u8"Blöde C++ Scheiße äöü!!1Elf"s;
auto s1 = from_utf8(s0);
auto s2 = to_utf8(s1);
return 0;
}
#include <stdio.h>
#include <string>
#include <codecvt>
#include <locale>
#include <vector>
using namespace std;
std::string utf8_to_string(const char *utf8str, const locale& loc){
// UTF-8 to wstring
wstring_convert<codecvt_utf8<wchar_t>> wconv;
wstring wstr = wconv.from_bytes(utf8str);
// wstring to string
vector<char> buf(wstr.size());
use_facet<ctype<wchar_t>>(loc).narrow(wstr.data(), wstr.data() + wstr.size(), '?', buf.data());
return string(buf.data(), buf.size());
}
int main(int argc, char* argv[]){
std::string ansi;
char utf8txt[] = {0xc3, 0xa1, 0};
// I guess you want to use Windows-1252 encoding...
ansi = utf8_to_string(utf8txt, locale(".1252"));
// Now do something with the string
return 0;
}
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 将ANSI C字符串转换为UNICODE
- 用于从 ANSI 字符串转换为 std::basic_string <TCHAR>的正确函数声明
- 如何将 ANSI C 结构转换为 C++ 类,但保持其 ANSI C 友好
- 从UTF-8到ANSI wcstomb的转换在一个特定字符处失败
- ANSI到Unicode或向后转换:怎么可能?
- 错误:ANSI C++禁止在赋值中从"void *"进行隐式转换
- 如何使用标准c++将UTF-8转换为ANSI
- 在c++中将UTF-8转换为ANSI
- 如何将ANSI字符(char)转换为Unicode字符(wchar_t),反之亦然
- ANSI代码页中wchar_t char之间的转换
- 如何将ANSI字节转换为Unicode字符串
- 如何将 ANSI 项目转换为 UNICODE 项目