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++ 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之后,

正如您所看到的,程序应该创建文件“foo”
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