taoyuanming_ 2024-07-10 14:44 采纳率: 0%
浏览 4

英文显示正常、中文显示乱码是为什么

🆘从txt里面以宽字符串读出内容,文档里的英文可以正常显示,中文就会显示成乱码,但是如果单纯给新的宽字符串变量赋值wstring wideStr = L"这是一个宽字符串";outtextxy(100, 410, wideStr.c_str());结果这里的中文又可以正常显示..

img

​请问这是什么问题,要怎么改呢

尝试过按照要求用文件流的方式读,说是能解决ansi编码匹配问题,但结果是中英文都不显示了;
​尝试过改txt和编译器编码类型都是utf-8,但是程序会显示栈有问题然后运行不了;

​晕了,谁来指点一下我

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-10 14:44
    关注

    引自免费微信小程序:皆我百晓生

    这个问题涉及到Unicode字符编码的问题。在C++中,std::wstring用于处理宽字符串(包含汉字等非ASCII字符)。为了确保正确地解析和输出这些字符,你需要确保输入文本中的所有字符都符合UTF-32编码。

    以下是可能的解决步骤:

    1. 确保源文本中的所有字符都符合UTF-32编码。
    2. 在读取文本时,使用std::wifstream而不是std::ifstream
    3. wideStr设置为一个正确的UTF-32编码的字符串。

    下面是修改后的代码示例:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <codecvt>
    
    using namespace std;
    
    int main()
    {
        // 假设我们有一个包含乱码的文本文件
        string filePath = "your_file.txt";
        ifstream inputFile(filePath);
    
        if (!inputFile.is_open())
            cout << "Failed to open file." << endl;
        
        string text;
        while (getline(inputFile, text))
        {
            // 使用UTF-32编码进行解码
            wstring wideStr = utf8_to_wchar(text);
            wideStr += L'\0'; // 添加结尾符,防止意外的空格导致乱码
    
            // 输出宽字符串
            outtextxy(100, 410, wideStr.c_str());
        }
    
        return 0;
    }
    

    在这个例子中,我们首先打开文件,然后逐行读取文件内容。对于每行,我们先将文本转换为UTF-8格式,然后再将其转换为宽字符串。注意,在输出宽字符串时,我们需要添加一个结尾符\0,以防止意外的空格导致乱码。

    此外,如果你想要更直观地查看文件内容,可以在调用outtextxy函数之前绘制文本框,并在其中放置文本。这可以通过创建一个新的窗口并绘制文本来实现。例如:

    void drawText(string text)
    {
        int width = 50; // 设置文本宽度
        int height = 20; // 设置文本高度
        int x = 50; // 文本左上角的X坐标
        int y = 50; // 文本左上角的Y坐标
        int fontSize = 16; // 文本字体大小
    
        // 创建一个新的窗口
        system("cls");
        int screenWidth = 800;
        int screenHeight = 600;
        createWindow(screenWidth, screenHeight);
    
        // 绘制文本框
        setCursorPos(x, y);
        rectangle(x, y, x + width - 1, y + height - 1);
    
        // 绘制文本
        setTextColor(WHITE); // 设置文本颜色为白色
        setFontFace(TEXT_FONT_NAME); // 设置字体为宋体
        setFontSize(fontSize); // 设置字体大小
        setLineSpacing(1); // 设置行间距为1
        setOutlineThickness(1); // 设置边框厚度为1
        setOutlineColor(BLACK); // 设置边框颜色为黑色
        drawStringAt(text.c_str(), x, y);
    
        waitKey();
    }
    
    // 主函数
    int main()
    {
        // 假设我们有一个包含乱码的文本文件
        string filePath = "your_file.txt";
        ifstream inputFile(filePath);
    
        if (!inputFile.is_open())
            cout << "Failed to open file." << endl;
    
        string text;
        while (getline(inputFile, text))
        {
            // 使用UTF-32编码进行解码
            wstring wideStr = utf8_to_wchar(text);
            wideStr += L'\0'; // 添加结尾符,防止意外的空格导致乱码
    
            // 输出宽字符串
            drawText(wideStr);
    
            // 重置文本框以便于绘制下一个文本框
            clearScreen();
            drawText("");
        }
    
        return 0;
    }
    

    这个例子展示了如何绘制文本框并将文本放入其中。每次循环迭代都会清空屏幕并重新绘制文本框,以便于绘制下一行文本。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月10日

悬赏问题

  • ¥15 openHarmony 利用c++程序在dayu210开发板上实现拉取RTSP视频流并且在屏幕上显示
  • ¥15 GD32H757的can通信配置
  • ¥20 nist随机数测试的问题
  • ¥20 帮我解决这个项目,thank you各位程序员
  • ¥15 哪位能用ea软件做一下,有偿
  • ¥15 按要求编写汇编语言,并设计仿真电路图
  • ¥15 电脑软件运行次数如何统计
  • ¥15 同一个浏览器打开两个窗口怎么区分会话
  • ¥100 如何编写自己的emmc镜像
  • ¥15 starccm线性内聚力模型