wunoa 2024-04-06 14:00 采纳率: 0%
浏览 11
已结题

用控制台显示特殊字符

用VS2015控制台显示特殊字符:
如 心形(❤)。控制台是936编码。

img

img

字符在**.txt里(UTF-8格式),可以读出,通过MultiByteToWideChar可以转换,如图

img

img


从chs转换到strS成功。在自动窗口可以看见转换及显示正确。

img

再从strS转换到szR就成乱码了。显示就已经不正确了。以下是变量的定义。

因为只读一个字符,所以char chs[3],
WCHAR *strS,CHAR szR[2].
目的:用控制台来仿记事本的显示功能

  • 写回答

25条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-06 14:00
    关注
    获得0.45元问题酬金

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

    针对您所描述的问题,要在VS2015控制台显示特殊字符(如心形 ❤)并实现类似记事本的显示功能,您可以按照以下步骤进行操作:

    1. 确保字符编码兼容性

    由于您的控制台当前处于GBK(编码为936)环境,而您要显示的字符来自UTF-8编码的文本文件,因此在读取和处理字符串时需注意编码转换。

    1. 读取UTF-8文本文件中的特殊字符

    首先,使用适当的方法读取UTF-8格式的.txt文件中的心形字符,并将其存储在char数组chs中。这里提供一个简单的示例:

    #include <fstream>
    #include <string>
    
    std::ifstream file("your_file_path.txt", std::ios::binary);
    if (file)
    {
        file.seekg(0, std::ios::end);
        size_t fileSize = file.tellg();
        file.seekg(0, std::ios::beg);
    
        char* chs = new char[fileSize];
        file.read(chs, fileSize);
        file.close();
    
        // Now chs contains the contents of your UTF-8 text file.
    }
    
    1. 将UTF-8字符转换为宽字符(Unicode)

    使用MultiByteToWideChar函数将chs中的UTF-8编码的心形字符转换为宽字符数组strS。根据您提供的信息,已知这部分转换是成功的。确保分配足够的内存给strS,并在调用MultiByteToWideChar时传入正确的参数。您的代码片段看起来已经正确实现了这一部分:

    int k = MultiByteToWideChar(CP_UTF8, 0, chs, -1, NULL, 0);
    WCHAR* strS = new WCHAR[k + 1];
    MultiByteToWideChar(CP_UTF8, 0, chs, -1, strS, k);
    strS[k] = '\0'; // Add null terminator for safety
    
    1. 设置控制台为UTF-8编码

    为了在控制台中正确显示特殊字符,您需要将控制台编码调整为支持这些字符的编码。虽然您提到控制台当前为936编码,但为了显示UTF-8字符,建议临时切换至UTF-8编码。这可以通过以下命令完成:

    system("chcp 65001"); // Set console code page to UTF-8
    
    1. 打印宽字符到控制台

    由于控制台已设置为UTF-8编码,可以直接输出宽字符数组strS到控制台:

    wprintf(L"%s\n", strS); // Print wide string to console
    
    1. 恢复控制台原始编码(可选)

    如果您希望在程序结束时恢复控制台到原来的936编码,可以添加以下代码:

    system("chcp 936"); // Restore console code page to original value
    

    综上所述,结合以上各步骤,完整的示例代码如下:

    #include <iostream>
    #include <fstream>
    #include <string>
    
    int main()
    {
        // Step 2: Read UTF-8 character from file
        std::ifstream file("your_file_path.txt", std::ios::binary);
        if (file)
        {
            file.seekg(0, std::ios::end);
            size_t fileSize = file.tellg();
            file.seekg(0, std::ios::beg);
    
            char* chs = new char[fileSize];
            file.read(chs, fileSize);
            file.close();
        }
    
        // Step 3: Convert UTF-8 to wide characters
        int k = MultiByteToWideChar(CP_UTF8, 0, chs, -1, NULL, 0);
        WCHAR* strS = new WCHAR[k + 1];
        MultiByteToWideChar(CP_UTF8, 0, chs, -1, strS, k);
        strS[k] = '\0';
    
        // Step 4: Set console to UTF-8 encoding
        system("chcp 65001");
    
        // Step 5: Print wide characters to console
        wprintf(L"%s\n", strS);
    
        // Step 6: Restore console to original encoding (optional)
        system("chcp 936");
    
        delete[] chs;
        delete[] strS;
    
        return 0;
    }
    

    请替换 "your_file_path.txt" 为实际包含心形字符的UTF-8文本文件路径。运行此代码后,控制台应能正确显示心形字符 ❤。

    请注意,上述代码仅针对您提供的特定情况,即从UTF-8文件中读取单个特殊字符并显示在控制台上。若要实现类似记事本的更多功能,可能需要扩展代码以处理更复杂的文本数据和用户交互。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月14日
  • 创建了问题 4月6日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。