注册 登录
编程论坛 C语言论坛

求助 读取汉字,再输出,变成乱码

追梦人zmrghy 发布于 2022-05-23 14:37, 1478 次点击
读取汉字,再输出,变成乱码。
直接输出汉字,正常。。。
程序代码:

//#pragma execution_character_set("gbk")
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
    int cnt = 0;
    string str;
    ifstream fin("a.txt", ios::in);
    if (!fin) {
        printf("The file is not exist!");
        return -1;
    }
    while (getline(fin, str))
    {
        cnt++;
        cout << str << endl;
    }
    str = "中文乱码";
    cout << endl << str << endl << endl;
    return 0;
}


代码中第一行,启用也是一样。。。。


只有本站会员才能查看附件,请 登录


这几天,学什么。做什么,都特别,别扭。。。
是因为,换了VS2015吗,
VS2015和VS2010相比,特别卡。反应很慢!!!!!!
5 回复
#2
rjsp2022-05-23 14:53
你应该将 a.txt 以附件的形式发上来,哪个有问题贴哪个
或者,根据你的代码,将 a.txt 另存为 ANSI编码(其实是gb2312)。

如果你一定要读取 utf8 编码的文件,再以 gb2312/gbk 格式输出的话,你确认几个问题
a. 是不是可以当成文本格式?你认为的文本格式,不是库认为的文本格式,而且是不是支持BOM
b. 将 utf8 编码转变为 gb2312 格式,或 utf16 BE 格式
#3
追梦人zmrghy2022-05-23 14:59
txt文件从UTF-8改成ANSI就可以了。。。
只有本站会员才能查看附件,请 登录


我记得,以前用VS2010时,有一次读取txt文件时,汉字也是乱码。
把txt文件,从ANSI改成UTF-8就可以了。。。
这次却是,从UTF-8改成ANSI。。。
到底什么时候使用ANSI, 什么时候使用UTF-8
#4
追梦人zmrghy2022-05-23 15:01
回复 2楼 rjsp
看3楼
txt文件从UTF-8改成ANSI就可以了。。。


我记得,以前用VS2010时,有一次读取txt文件时,汉字也是乱码。
把txt文件,从ANSI改成UTF-8就可以了。。。
这次却是,从UTF-8改成ANSI。。。
到底什么时候使用ANSI, 什么时候使用UTF-8

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2022-5-23 15:14编辑过]

#5
wp2319572022-05-23 15:18
回复 4楼 追梦人zmrghy
这个主要是vscode 等大多数软件都默认UTF8  而windows的cmd或者powershell都是默认GBK
所以有时会有编码不一致的现象 导致所谓的乱码   发现乱码就研究调整呗,反正我们常见的冲突就是UTF8和GBK之间
#6
rjsp2022-05-23 16:50
回复 4楼 追梦人zmrghy
wp231957 说得对
另外,我也没什么好讲的了,在2楼时早就讲完了

读取 utf8 without BOM 格式,转换成 gbk 格式显示(用C++代码演示,你题目中的代码就是C++)
程序代码:
#include <iostream>
#include <fstream>
#include <string>
#include <filesystem>
using namespace std;

int main( void )
{
    // 你的 a.txt 是不带BOM的utf8格式
   
// 那可以当成文本格式看待,但需要将读取到的 utf8编码转换成

    ifstream fin( "D:/a.txt" );
    for( string line; getline(fin,line); )
    {
        // utf8 -> gbk
        
// 我只是做个示例,在真实的项目中你不应该这么做,免得被人打!!!
        
// 你应该用 ICU/iconv 进行编码转换,std::codecvt 太难用了
        {
            std::filesystem::path tmp { (const char8_t*)line.c_str() };
            line = tmp.string();
        }

        cout << line << '\n';
    }
}


文件虽是 utf8 without BOM 格式,但直接读取成 gbk 格式。切记,这里用了非标准的方法,只适合VC!(C语言演示)
#include <stdio.h>
#include <locale.h>
using namespace std;

int main( void )
{
    setlocale( LC_CTYPE, "" );

    FILE* fin = fopen( "d:/a.txt", "rt, ccs=UTF-8" ); // 注意 ccs=UTF-8 是非标准的
    if( fin )
    {
        for( wint_t ch; ch=fgetwc(fin), ch!=WEOF; )
            putwchar( ch );

        fclose( fin );
    }
}
1