mfc中读取txt中文乱码

mfc中通过Edit Control进行显示txt文本,里边有中文的,乱码,如何解决。

img


```c++
void JBXX::OnBnClickedButton1()//读取
{
    // TODO: 在此添加控件通知处理程序代码
    TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*");
    CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this);
    if (fileDlg.DoModal() == IDOK) {
        CString strFilePath = fileDlg.GetPathName();
        SetDlgItemText(IDC_EDIT_TXT, strFilePath);

        //CFile  CStdioFile
        CStdioFile sourceFile;
        CFileException ex;
        if (!sourceFile.Open(strFilePath, CFile::modeRead, &ex)) {
            TCHAR szError[1024];
            ex.GetErrorMessage(szError, 1024);
            MessageBox(szError, _T("打开文件"));
            return;
        }

        CString buf;
        while (sourceFile.ReadString(buf)) {
            m_textzhi = m_textzhi + buf + _T("\r\n");
        }

        sourceFile.Close();
        UpdateData(false); // 将变量m_edit,更新到控件中。
    }
}


void JBXX::OnBnClickedButton2()//另存为
{
    // TODO: 在此添加控件通知处理程序代码
    TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*");
    CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this);

    CString strFilePath;
    if (fileDlg.DoModal() == IDOK) {
        strFilePath = fileDlg.GetPathName();
    }

    CStdioFile dstFile;
    CFileException ex;
    if (!dstFile.Open(strFilePath, CFile::modeCreate | CFile::modeWrite, &ex)) {
        TCHAR szError[1024];
        ex.GetErrorMessage(szError, 1024);
        MessageBox(szError, _T("打开目标文件"));
        return;
    }

    TCHAR buff[4096];
    int lineCount = m_text.GetLineCount(); // 获取文本框中文本的 行数
    for (int i = 0; i < lineCount; i++) {
        memset(buff, 0, 4096);

        int nRead = m_text.GetLine(i, buff, 4096);
        if (nRead == 0) {
            dstFile.WriteString(_T("\n"));
        }
        else {
            wcscat_s(buff, _T("\n"));
            dstFile.WriteString(buff);
        }
    }

    dstFile.Close();
}



你的项目是多字节字符集?然后txt是utf8编码?把txt另存为ansi编码。

img

你的代码是用的 CEdit 控件,可以换成使用 CRichEditCtrl 控件,它支持 RTF 格式。在读取文本时,使用 LoadFile() 方法加载 RTF 文件,将内容转换为 Unicode 编码即可正常显示中文。在保存文本时,使用 SaveFile() 方法保存 RTF 文件即可。


如果以上回答对您有所帮助,望采纳~谢谢

参考GPT和自己的思路:您好,如果读取的文本文件中含有中文,可能是编码格式的问题导致的乱码。您可以尝试使用 Unicode 编码方式打开文本文件,即使用 CStdioFile 的 CFile::typeUnicode 参数,例如:

if (!sourceFile.Open(strFilePath, CFile::modeRead | CFile::typeUnicode, &ex)) {

如果您确定文件的编码格式为 GBK 或者其他编码方式,可以将 CFile::typeUnicode 参数改为对应的编码方式,例如:

if (!sourceFile.Open(strFilePath, CFile::modeRead, &ex)) {
    CTextEncoding encoding("GBK");
    if (!sourceFile.Open(strFilePath, CFile::modeRead | CFile::typeText, &ex, &encoding)) {


这样读取文本文件时,会按照指定的编码方式进行解码,避免出现乱码。同时,在保存文本文件时,可以将编码方式设置为相同的方式,例如:

CStdioFile dstFile;
CFileException ex;
if (!dstFile.Open(strFilePath, CFile::modeCreate | CFile::modeWrite | CFile::typeUnicode, &ex)) {


这样保存的文本文件也会按照 Unicode 编码方式进行编码,避免出现乱码。

参考GPT和自己的思路,在读取和保存文件时,需要确保文件以正确的编码格式打开和保存。在 Windows 平台上,常见的编码格式为 UTF-8 和 GBK(简体中文)、Big5(繁体中文)等。如果文件采用不同的编码格式,则在读取和保存时就会出现中文乱码问题。

为了解决这个问题,可以在读取和保存文件时,使用 CStdioFile 类的不同构造函数,指定文件的编码格式。例如,以下代码将文件以 UTF-8 编码格式打开:

CString strFilePath = fileDlg.GetPathName();
CStdioFile sourceFile(strFilePath, CFile::modeRead | CFile::typeText, CFile::shareDenyNone, NULL, CFile::encodingUTF8);

保存文件时,也需要指定保存的编码格式。例如,以下代码将文件以 GBK 编码格式保存:

CString strFilePath;
if (fileDlg.DoModal() == IDOK) {
    strFilePath = fileDlg.GetPathName();
}

CStdioFile dstFile(strFilePath, CFile::modeCreate | CFile::modeWrite | CFile::typeText, CFile::shareDenyNone, NULL, CFile::encodingGB2312);

// 写入文件内容
// ...

dstFile.Close();

另外,确保在读取文件时,文本框也以正确的编码格式进行显示。可以通过修改界面资源文件,将文本框的字体设置为支持中文字符集的字体,例如“Microsoft YaHei”,同时将“MultiLine”属性设置为“True”。此外,也可以在代码中使用 SetFont() 函数设置文本框的字体。

整理后的代码如下所示:

void JBXX::OnBnClickedButton1()//读取
{
    // TODO: 在此添加控件通知处理程序代码
    TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*");
    CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this);
    if (fileDlg.DoModal() == IDOK) 
    {
        CString strFilePath = fileDlg.GetPathName();
        SetDlgItemText(IDC_EDIT_TXT, strFilePath);

        // 以 UTF-8 编码格式读取文件
        CStdioFile sourceFile(strFilePath, CFile::modeRead | CFile::typeText, CFile::shareDenyNone, NULL, CFile::encodingUTF8);
        if (!sourceFile.IsOpen()) {
            AfxMessageBox(_T("打开文件失败!"));
            return;
        }

        CString buf;
        while (sourceFile.ReadString(buf)) {
            m_textzhi += buf + _T("\r\n");
        }

        sourceFile.Close();

        // 设置文本框的字体
        CFont font;
        font.CreatePointFont(160, _T("Microsoft YaHei"));
        GetDlgItem(IDC_EDIT_TEXT)->SetFont(&font);

        UpdateData(false);
    }
}

void JBXX::OnBnClickedButton2()//另存为
{
    TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*");
    CFileDialog fileDlg(FALSE, _T("txt"), NULL, 0, szFilter, this);

    CString strFilePath;
    if (fileDlg.DoModal() == IDOK) {
        strFilePath = fileDlg.GetPathName();
    }

    if (strFilePath.IsEmpty()) {
        return;
    }

    // 以 GBK 编码格式保存文件
    CStdioFile dstFile(strFilePath, CFile::modeCreate | CFile::modeWrite | CFile::typeText, CFile::shareDenyNone, NULL, CFile::encodingGB2312);
    if (!dstFile.IsOpen()) {
        AfxMessageBox(_T("打开文件失败!"));
        return;
    }

    TCHAR buff[4096];
    int lineCount = m_text.GetLineCount();
    for (int i = 0; i < lineCount; i++) {
        memset(buff, 0, 4096);

        int nRead = m_text.GetLine(i, buff, 4096);
        if (nRead == 0) {
            dstFile.WriteString(_T("\n"));
        }
        else {
            wcscat_s(buff, _T("\n"));
            dstFile.WriteString(buff);
        }
    }

    dstFile.Close();
}

回答不易,还请采纳!!!

该回答引用ChatGPT

如有疑问,可以回复我!

在 MFC 中使用 Edit Control 显示文本时出现乱码可能有以下几种情况:

1、编码格式不正确:如果文本是以 UTF-8 或 GBK 等编码格式保存的,而 Edit Control 的编码格式是 ANSI,则会出现乱码。解决方法是在打开文件时指定正确的编码格式,或者将 Edit Control 的编码格式修改为 UTF-8 或 GBK 等。

2、字体不支持中文:如果 Edit Control 使用的字体不支持中文,也会出现乱码。解决方法是将字体设置为支持中文的字体,如宋体、黑体等。

3、系统环境问题:如果系统的语言设置不正确,也可能会出现乱码。解决方法是在控件中显示中文之前,设置系统的语言为中文。

下面是修改代码的示例,可以在打开文件时指定编码格式为 UTF-8:


CStdioFile sourceFile;
CFileException ex;
if (!sourceFile.Open(strFilePath, CFile::modeRead | CFile::typeText, &ex)) {
    TCHAR szError[1024];
    ex.GetErrorMessage(szError, 1024);
    MessageBox(szError, _T("打开文件"));
    return;
}
 
CString buf;
while (sourceFile.ReadString(buf)) {
    m_textzhi = m_textzhi + buf + _T("\r\n");
}
 
sourceFile.Close();
UpdateData(false); // 将变量m_edit,更新到控件中。

在打开文件时使用 CFile::typeText 参数来指定编码格式为文本模式,这样在读取文件时就会按照正确的编码格式解码文件内容,从而避免乱码问题。