C++ UTF-8到宽字符转换 #ifndef UNICODE #定义UNICODE #恩迪夫 #包括 #包括 #包括 使用名称空间std; int main() { 文件*resFile; char multiByteStr[256]; If文件流; 文件*示例文件; TCHAR缓冲区[256]; 系统(“chcp 65001”); resFile=wfoon(L“foo”,L“w,ccs=UTF-8”); fwprintf(resFile,L“%s”,L“C:\\exsistingFolder\\zażó322;ćgğłjaź)☺☻♥♦• ć.txt”); fclose(resFile); 开放式文件(L“foo”); getline(multiByteStr,256,'\n'); oFile.close(); MultiByteToWideChar(CP_UTF8,0,multiByteStr,256,buffer,256); wprintf(L“%s”,缓冲区); 示例文件=wfopen(缓冲区,L“w,ccs=UTF-16LE”); fwprintf(示例文件,L“%s”,缓冲区); fclose(示例文件); 系统(“暂停”); 返回0; }
正如您所看到的,程序应该创建文件“foo”C++ UTF-8到宽字符转换 #ifndef UNICODE #定义UNICODE #恩迪夫 #包括 #包括 #包括 使用名称空间std; int main() { 文件*resFile; char multiByteStr[256]; If文件流; 文件*示例文件; TCHAR缓冲区[256]; 系统(“chcp 65001”); resFile=wfoon(L“foo”,L“w,ccs=UTF-8”); fwprintf(resFile,L“%s”,L“C:\\exsistingFolder\\zażó322;ćgğłjaź)☺☻♥♦• ć.txt”); fclose(resFile); 开放式文件(L“foo”); getline(multiByteStr,256,'\n'); oFile.close(); MultiByteToWideChar(CP_UTF8,0,multiByteStr,256,buffer,256); wprintf(L“%s”,缓冲区); 示例文件=wfopen(缓冲区,L“w,ccs=UTF-16LE”); fwprintf(示例文件,L“%s”,缓冲区); fclose(示例文件); 系统(“暂停”); 返回0; },c++,c,windows,unicode,C++,C,Windows,Unicode,正如您所看到的,程序应该创建文件“foo”resFile,其中包含要创建的文件的完整路径,并且这个新文件exampleFile应该包含指向自身的路径。虽然在VisualStudio2010 autos中调试时,会生成缓冲区具有正确字符串的结果,但不会创建exampleFile。为什么? 还有一件事:为什么wprintf不输出扩展字符,尽管我已经将console的字体切换到Lucida console,即可以处理未编码字符的字体 Ps.exampleFile指向NULL,即使在\wfopen之后,
resFile
,其中包含要创建的文件的完整路径,并且这个新文件exampleFile
应该包含指向自身的路径。虽然在VisualStudio2010 autos中调试时,会生成缓冲区具有正确字符串的结果,但不会创建exampleFile。为什么?还有一件事:为什么
wprintf
不输出扩展字符,尽管我已经将console的字体切换到Lucida console,即可以处理未编码字符的字体
Ps.exampleFile指向
NULL
,即使在\wfopen
之后,缓冲区的最后一个字符是'/0'
您没有进行任何错误处理。最重要的是,在调用MultiByteToWideChar()
时,您告诉它转换整个multiByteStr
缓冲区,但大部分缓冲区包含垃圾,因为您事先没有将其归零。您必须使用缓冲区中的实际字符数,而不是缓冲区的最大大小MultiByteToWideChar()
可能返回一个您忽略的错误。代码中还有其他几个故障点。您需要经常检查错误,尤其是在与操作系统交互时
试试这个:
#ifndef UNICODE
#define UNICODE
#endif
#include <Windows.h>
#include <cstdio>
#include <fstream>
using namespace std;
int main()
{
FILE* resFile;
char multiByteStr[256];
ifstream oFile;
FILE* exampleFile;
TCHAR buffer[256];
system("chcp 65001");
resFile = _wfopen(L"foo",L"w, ccs=UTF-8");
fwprintf(resFile,L"%s",L"C:\\exsistingFolder\\zażółć gęśłą jaźń ☺☻♥♦• ć.txt");
fclose(resFile);
oFile.open(L"foo");
oFile.getline(multiByteStr,256,'\n');
oFile.close();
MultiByteToWideChar(CP_UTF8,0,multiByteStr,256,buffer,256);
wprintf(L"%s",buffer);
exampleFile = _wfopen(buffer,L"w, ccs=UTF-16LE");
fwprintf(exampleFile,L"%s",buffer);
fclose(exampleFile);
system("pause");
return 0;
}
#定义UNICODE
#包括
#包括
#包括
使用名称空间std;
无效暂停()
{
wcin.ignore();
wcin.get();
}
int main()
{
文件*resFile;
char multiByteStr[256]={0};
If文件流;
文件*示例文件;
WCHAR缓冲区[256]={0};
设置控制台输出CP(CP_UTF8);
resFile=wfoon(L“foo”,L“w,ccs=UTF-8”);
如果(!resFile){
wprintf(L“无法创建foo”);
去做;
}
fwprintf(resFile,L“%s”,L“C:\\exsistingFolder\\zażó322;ćgğłjaź)☺☻♥♦• ć.txt”);
fclose(resFile);
如果(!oFile.open(L“foo”)){
wprintf(L“无法打开foo”);
去做;
}
getline(multiByteStr,255,'\n');
oFile.close();
if(MultiByteToWideChar(CP_UTF8,0,multiByteStr,-1,buffer,256)=0){
wprintf(L“无法将UTF-8转换为UTF-16。错误:%u”,GetLastError());
去做;
}
示例文件=wfopen(缓冲区,L“w,ccs=UTF-16LE”);
如果(!exampleFile){
wprintf(L“无法创建文件:%s”,缓冲区);
去做;
}
fwprintf(示例文件,L“%s”,缓冲区);
fclose(示例文件);
wprintf(L“已创建文件:%s”,缓冲区);
完成:
暂停();
返回0;
}
您没有进行任何错误处理。最重要的是,在调用MultiByteToWideChar()
时,您告诉它转换整个multiByteStr
缓冲区,但大部分缓冲区包含垃圾,因为您事先没有将其归零。您必须使用缓冲区中的实际字符数,而不是缓冲区的最大大小MultiByteToWideChar()
可能返回一个您忽略的错误。代码中还有其他几个故障点。您需要经常检查错误,尤其是在与操作系统交互时
试试这个:
#ifndef UNICODE
#define UNICODE
#endif
#include <Windows.h>
#include <cstdio>
#include <fstream>
using namespace std;
int main()
{
FILE* resFile;
char multiByteStr[256];
ifstream oFile;
FILE* exampleFile;
TCHAR buffer[256];
system("chcp 65001");
resFile = _wfopen(L"foo",L"w, ccs=UTF-8");
fwprintf(resFile,L"%s",L"C:\\exsistingFolder\\zażółć gęśłą jaźń ☺☻♥♦• ć.txt");
fclose(resFile);
oFile.open(L"foo");
oFile.getline(multiByteStr,256,'\n');
oFile.close();
MultiByteToWideChar(CP_UTF8,0,multiByteStr,256,buffer,256);
wprintf(L"%s",buffer);
exampleFile = _wfopen(buffer,L"w, ccs=UTF-16LE");
fwprintf(exampleFile,L"%s",buffer);
fclose(exampleFile);
system("pause");
return 0;
}
#定义UNICODE
#包括
#包括
#包括
使用名称空间std;
无效暂停()
{
wcin.ignore();
wcin.get();
}
int main()
{
文件*resFile;
char multiByteStr[256]={0};
If文件流;
文件*示例文件;
WCHAR缓冲区[256]={0};
设置控制台输出CP(CP_UTF8);
resFile=wfoon(L“foo”,L“w,ccs=UTF-8”);
如果(!resFile){
wprintf(L“无法创建foo”);
去做;
}
fwprintf(resFile,L“%s”,L“C:\\exsistingFolder\\zażó322;ćgğłjaź)☺☻♥♦• ć.txt”);
fclose(resFile);
如果(!oFile.open(L“foo”)){
wprintf(L“无法打开foo”);
去做;
}
getline(multiByteStr,255,'\n');
oFile.close();
if(MultiByteToWideChar(CP_UTF8,0,multiByteStr,-1,buffer,256)=0){
wprintf(L“无法将UTF-8转换为UTF-16。错误:%u”,GetLastError());
去做;
}
示例文件=wfopen(缓冲区,L“w,ccs=UTF-16LE”);
如果(!exampleFile){
wprintf(L“无法创建文件:%s”,缓冲区);
去做;
}
fwprintf(示例文件,L“%s”,缓冲区);
fclose(示例文件);
wprintf(L“已创建文件:%s”,缓冲区);
完成:
暂停();
返回0;
}
为什么要混合和匹配您的I/O库?下面是一个纯(Windows)C解决方案,减去错误检查:
#define UNICODE
#include <Windows.h>
#include <cstdio>
#include <fstream>
using namespace std;
void pause()
{
wcin.ignore();
wcin.get();
}
int main()
{
FILE* resFile;
char multiByteStr[256] = {0};
ifstream oFile;
FILE* exampleFile;
WCHAR buffer[256] = {0};
SetConsoleOutputCP(CP_UTF8);
resFile = _wfopen(L"foo",L"w, ccs=UTF-8");
if (!resFile) {
wprintf(L"Unable to create foo");
goto done;
}
fwprintf(resFile,L"%s",L"C:\\exsistingFolder\\zażółć gęśłą jaźń ☺☻♥♦• ć.txt");
fclose(resFile);
if (!oFile.open(L"foo")) {
wprintf(L"Unable to open foo");
goto done;
}
oFile.getline(multiByteStr,255,'\n');
oFile.close();
if (MultiByteToWideChar(CP_UTF8,0,multiByteStr,-1,buffer,256) == 0) {
wprintf(L"Unable to convert UTF-8 to UTF-16. Error: %u", GetLastError());
goto done;
}
exampleFile = _wfopen(buffer,L"w, ccs=UTF-16LE");
if (!exampleFile) {
wprintf(L"Unable to create file: %s", buffer);
goto done;
}
fwprintf(exampleFile,L"%s",buffer);
fclose(exampleFile);
wprintf(L"created file: %s", buffer);
done:
pause();
return 0;
}
#包括
#包括
int main()
{
文件*pFile;
wchar_t缓冲区[256];
_wfopen_s(和pFile,L“foo”,L“w,ccs=UTF-8”);
fputws(L“C:/existingFolder/zażółćgğłąjaźń☺☻♥♦• ć.txt“,pFile);
fclose(pFile);
_wfopen_s(和pFile,L“foo”,L“r,ccs=UTF-8”);
fgetws(缓冲区、缓冲区计数、pFile);
fclose(pFile);
_wfopen_s(&P文件,缓冲区,L“w,ccs=UTF-16LE”);
fputws(缓冲区,pFile);
fclose(pFile);
返回0;
}
为什么要混合和匹配您的I/O库?下面是一个纯(Windows)C解决方案,减去错误检查:
#define UNICODE
#include <Windows.h>
#include <cstdio>
#include <fstream>
using namespace std;
void pause()
{
wcin.ignore();
wcin.get();
}
int main()
{
FILE* resFile;
char multiByteStr[256] = {0};
ifstream oFile;
FILE* exampleFile;
WCHAR buffer[256] = {0};
SetConsoleOutputCP(CP_UTF8);
resFile = _wfopen(L"foo",L"w, ccs=UTF-8");
if (!resFile) {
wprintf(L"Unable to create foo");
goto done;
}
fwprintf(resFile,L"%s",L"C:\\exsistingFolder\\zażółć gęśłą jaźń ☺☻♥♦• ć.txt");
fclose(resFile);
if (!oFile.open(L"foo")) {
wprintf(L"Unable to open foo");
goto done;
}
oFile.getline(multiByteStr,255,'\n');
oFile.close();
if (MultiByteToWideChar(CP_UTF8,0,multiByteStr,-1,buffer,256) == 0) {
wprintf(L"Unable to convert UTF-8 to UTF-16. Error: %u", GetLastError());
goto done;
}
exampleFile = _wfopen(buffer,L"w, ccs=UTF-16LE");
if (!exampleFile) {
wprintf(L"Unable to create file: %s", buffer);
goto done;
}
fwprintf(exampleFile,L"%s",buffer);
fclose(exampleFile);
wprintf(L"created file: %s", buffer);
done:
pause();
return 0;
}
#包括
#包括
int main()
{
文件*pFile;
wchar_t缓冲区[256];
_wfopen_s(和pFile,L“foo”,L“w,ccs=UTF-8”);
fputws(L“C:/existi