gpt4 book ai didi

c++ - UTF-8 到宽字符转换

转载 作者:可可西里 更新时间:2023-11-01 11:21:00 24 4
gpt4 key购买 nike

#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;
}

如您所见,程序应创建包含要创建文件的完整路径的文件“foo”resFile,并且此新文件exampleFile 应包含自身的路径。尽管在 Visual Studio 2010 autos 中进行调试期间,缓冲区具有正确的字符串,但不会创建 exampleFile。为什么?
还有一件事:为什么 wprintf 不输出扩展字符,尽管我已经将控制台的字体切换为 Lucida Console - 可以处理未编码字符的字体。

附言。 exampleFile指向NULL,甚至在_wfopen之后,buffer的最后一个字符是'/0'

最佳答案

您没有进行任何错误处理。最重要的是,当调用 MultiByteToWideChar() 时,您是在告诉它转换整个 multiByteStr 缓冲区,但大部分缓冲区都包含垃圾,因为您没有事先将其归零。您必须使用缓冲区中的实际字符数,而不是缓冲区的最大大小。 MultiByteToWideChar() 可能会返回您忽略的错误。代码中还有其他几个故障点。您需要始终检查错误,尤其是在与操作系统交互时。

试试这个:

#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;
}

关于c++ - UTF-8 到宽字符转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10774653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com