标题:求助 读取汉字,再输出,变成乱码
只看楼主
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:399
专家分:190
注 册:2021-4-9
结帖率:97.22%
已结贴  问题点数:20 回复次数:5 
求助 读取汉字,再输出,变成乱码
读取汉字,再输出,变成乱码。
直接输出汉字,正常。。。
程序代码:
//#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相比,特别卡。反应很慢!!!!!!
搜索更多相关主题的帖子: 读取 乱码 汉字 输出 str 
2022-05-23 14:37
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
你应该将 a.txt 以附件的形式发上来,哪个有问题贴哪个
或者,根据你的代码,将 a.txt 另存为 ANSI编码(其实是gb2312)。

如果你一定要读取 utf8 编码的文件,再以 gb2312/gbk 格式输出的话,你确认几个问题
a. 是不是可以当成文本格式?你认为的文本格式,不是库认为的文本格式,而且是不是支持BOM
b. 将 utf8 编码转变为 gb2312 格式,或 utf16 BE 格式
2022-05-23 14:53
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:399
专家分:190
注 册:2021-4-9
得分:0 
txt文件从UTF-8改成ANSI就可以了。。。


我记得,以前用VS2010时,有一次读取txt文件时,汉字也是乱码。
把txt文件,从ANSI改成UTF-8就可以了。。。
这次却是,从UTF-8改成ANSI。。。
到底什么时候使用ANSI, 什么时候使用UTF-8
2022-05-23 14:59
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:399
专家分:190
注 册:2021-4-9
得分:0 
回复 2楼 rjsp
看3楼
txt文件从UTF-8改成ANSI就可以了。。。


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

a.txt (49 Bytes)

b.txt (42 Bytes)


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

2022-05-23 15:01
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:10 
回复 4楼 追梦人zmrghy
这个主要是vscode 等大多数软件都默认UTF8  而windows的cmd或者powershell都是默认GBK
所以有时会有编码不一致的现象 导致所谓的乱码   发现乱码就研究调整呗,反正我们常见的冲突就是UTF8和GBK之间

DO IT YOURSELF !
2022-05-23 15:18
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 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 );
    }
}
2022-05-23 16:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-509153-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016280 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved