Visual Studio 项目属性设置:
项目属性→C/C++→常规→附加包含目录
C:\Intel\include\iconv\include;
项目属性→链接器→常规→附加库目录
C:\Intel\include\iconv\lib;
项目属性→链接器→输入→附加依赖项
iconv.lib;
提示缺少"iconv.dll",需要将iconv.dll拷贝至main.cpp同阶目录。
cpp
#include <iostream>
#include <fstream>
#include <string>
#include "C:\Intel\include\iconv\include\iconv.h"
//#pragma comment (lib, "iconv.lib")
using namespace std;
string gb2312_to_utf8(const string& input);
bool FileConvertGb2312ToUtf8(string pathFile);
void SaveToLog(string path, string content);
int main(int argc, char* argv[])
{
int n = 0;
string path = string(argv[0]);
string pathLog = path.substr(0, path.find_last_of('\\') + 1) + "log.txt";
string log = string("123成功了Hello,world!");
SaveToLog(pathLog, log);
FileConvertGb2312ToUtf8(pathLog);
cin >> n;
return n;
}
bool FileConvertGb2312ToUtf8(string pathFile)
{
int pos = pathFile.find_last_of("\\");
string nameFile = pathFile.substr(pos + 1, pathFile.length() - pos - 5);
ifstream infile(pathFile, ios::binary);
if (!infile) {
cerr << "Failed to open input file" << endl;
return 1;
}
string content((istreambuf_iterator<char>(infile)), istreambuf_iterator<char>());
infile.close();
string utf8_content = gb2312_to_utf8(content);
if (utf8_content.empty()) {
cerr << "Failed to convert encoding" << endl;
return 1;
}
//pathLog = pathLog.replace(pathLog.find_last_of("log") + 1, 0, "_utf8");
string pathFileNew = pathFile.replace(pathFile.find_last_of(nameFile) + 1, 0, "_utf8");
ofstream outfile(pathFileNew, ios::binary);
if (!outfile) {
cerr << "Failed to open output file" << endl;
return 1;
}
outfile.write(utf8_content.data(), utf8_content.size());
outfile.close();
puts("文件转换成功!");
puts(pathFileNew.c_str());
return true;
}
string gb2312_to_utf8(const string& input)
{
iconv_t cd = iconv_open("UTF-8", "GB2312");
if (cd == (iconv_t)-1) {
cerr << "iconv_open failed" << endl;
return "";
}
size_t inbytesleft = input.size();
size_t outbytesleft = inbytesleft * 2;
char* inbuf = const_cast<char*>(input.c_str());
char* outbuf = new char[outbytesleft];
char* outptr = outbuf;
if (iconv(cd, (const char**)&inbuf, &inbytesleft, &outptr, &outbytesleft) == (size_t)-1) {
cerr << "iconv failed" << endl;
iconv_close(cd);
delete[] outbuf;
return "";
}
string output(outbuf, outptr - outbuf);
delete[] outbuf;
iconv_close(cd);
return output;
}
void SaveToLog(string path, string content)
{
ofstream outfile(path);
if (outfile.is_open())
{
outfile << content;
outfile.close();
puts("文件保存成功");
puts(path.c_str());
}
else
{
puts("文件保存失败");
puts(path.c_str());
}
}