求助C语言操作UTF-8 编码文件乱码问题

逆风孤歌 2017-08-29 01:25:30

新人求助 顺便混个脸熟。
我用C语言获取一个网页源码,在控制台打开是乱码,写入文件没有问题,但是用C语言处理写入的文件的时候 全是乱码
如图所示:



请问怎么解决呢?
修改获取到的源码编码?
...全文
865 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
逆风孤歌 2017-09-09
  • 打赏
  • 举报
回复
引用 7 楼 china_jeffery的回复:
这里有个针对c/c++开发者的讲解字符编码的文章 http://www.cnblogs.com/jiangxueqiao/p/7446229.html http://www.cnblogs.com/jiangxueqiao/p/7464408.html http://www.cnblogs.com/jiangxueqiao/p/7473456.html 建议楼主看下,你这就是文件编码转换的问题
谢谢回复,之后我已经对他进行了编码转换,好像可以了,至少控制台可以正常显示,可能是我文本处理出问题了
逆风孤歌 2017-09-09
  • 打赏
  • 举报
回复
引用 6 楼 赵4老师的回复:
其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
没有明白您的意思,没明白这里和我的代码的关系
逆风孤歌 2017-09-09
  • 打赏
  • 举报
回复
引用 5 楼 jena_wy的回复:
读取之前先把空间清零,即memset(空间首地址,0,长度);
谢谢,我会试试的,刚开学比较忙,回复的慢了
china_jeffery 2017-09-07
  • 打赏
  • 举报
回复
这里有个针对c/c++开发者的讲解字符编码的文章 http://www.cnblogs.com/jiangxueqiao/p/7446229.html http://www.cnblogs.com/jiangxueqiao/p/7464408.html http://www.cnblogs.com/jiangxueqiao/p/7473456.html 建议楼主看下,你这就是文件编码转换的问题
赵4老师 2017-09-05
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
jena_wy 2017-09-05
  • 打赏
  • 举报
回复
读取之前先把空间清零,即memset(空间首地址,0,长度);
逆风孤歌 2017-09-05
  • 打赏
  • 举报
回复
引用 1 楼 ckc 的回复:
用一些可以转换编码的编辑工具看看存盘的是不是utf8的格式 如果是的话要转码成gbk再存盘,抓网页的东西肯定要处理编码的 看你的例子似乎是你的程序还有问题,并不是编码的问题
是的啊 网页确实是UTF-8的 这个没问题 还是汉字占用两个字符的位置的关系?但是总不至于所有的汉字都是乱码吧
逆风孤歌 2017-09-05
  • 打赏
  • 举报
回复
#include<stdio.h> #include<conio.h> #include<string.h> #include<malloc.h> #include<windows.h> void PcpytoArr(char *strtemp, char arr[1024]) { if (strlen(strtemp) > 1024) { printf("来自PcpytoArr()函数的消息:复制的字符串超出长度\n"); return; } for (int i = 0; i < strlen(strtemp); i++) { arr[i] = strtemp[i]; } return; } char* U8toGBK(char u8str[]) { int len_wchart; wchar_t *unicode_2; int len_gbk; char* gbkstr = (char *)malloc(1024); len_wchart = MultiByteToWideChar(CP_UTF8, 0, u8str, -1, NULL, 0); unicode_2 = (wchar_t *)malloc(len_wchart*sizeof(wchar_t)); MultiByteToWideChar(CP_UTF8, 0, u8str, -1, unicode_2, len_wchart); len_gbk = WideCharToMultiByte(CP_ACP, 0, unicode_2, -1, NULL, 0, NULL, NULL); WideCharToMultiByte(CP_ACP, 0, unicode_2, -1, gbkstr, len_gbk, NULL, NULL); free(unicode_2); return gbkstr; } char *CutHE(char *temp, int s, int e) //去除头部s个字符 并去除尾部e个字符 { char *temp1 = NULL; temp1 = (char*)malloc(strlen(temp) - e - s); char temp2[1024]; int j = 0; for (int i = s; i < strlen(temp) - s; i++, j++) //去除头部 { temp2[j] = temp[i]; } j = 0; for (int i = 0; i < strlen(temp) - e; i++, j++) //去除尾部 { temp1[j] = temp2[i]; } return temp1; } bool ip_PD(char *ip) //判断参数是否是IP地址 { int cou = 0; for (int i = 0; i < strlen(ip); i++) { if (ip[i] == '.') { if (ip[i + 1] >= 48 && ip[i + 1] <= 57) { cou++; } } } if (cou == 3) { return true; //这个字符串是IP地址 或者含有IP地址 } return false; //这个字符串不是IP地址 } int FileUTF8ToGBK(char *path, char *path1) //把path指向的文件编码转换为GBK然后输出到path1所指向的文件 { FILE *fp = fopen(path, "r"); if (fp == NULL) { printf("打开文件错误\n"); _getch(); exit(1); } FILE *fp1 = fopen(path1, "w"); if (fp1 == NULL) { printf("写入文件错误\n"); _getch(); exit(1); } char *str = NULL; char arr[1024]; //char *err=NULL; while (fgets(arr, 1024, fp) != NULL) { PcpytoArr(U8toGBK(arr), arr); //printf("%s", arr); fputs(arr, fp1); } fclose(fp); fclose(fp1); return 0; } int main() { FileUTF8ToGBK("D:\\c.txt","D:\\temp.txt"); puts("转换文件编码完成!"); FILE *fp = fopen("D:\\temp.txt","r"); if (fp == NULL) { printf("打开源文件错误!\n任意键退出\n"); _getch(); return -1; //源文件打开失败 } FILE *fp1 = fopen("D:\\new.txt","w"); if (fp1 == NULL) { printf("写入文件失败,请使用管理员权限运行\n任意键推出程序\n"); _getch(); return -2; //目标文件写入失败 } char R1[1024]=" "; char R2[1024] = " "; char *e=NULL; char arr[1024]=" "; while (1) { fgets(arr,1024,fp); //获取IP if (ip_PD(arr)) { PcpytoArr(CutHE(arr, 8, 5), R1); fprintf(fp1,"%s:",R1); //写入IP fgets(arr, 1024, fp); //获取端口 PcpytoArr(CutHE(arr, 8, 5), R1); fprintf(fp1,"%s@",R1); //写入端口 fgets(arr, 1024, fp); fgets(arr, 1024, fp); fgets(arr, 1024, fp); //获取协议类型 PcpytoArr(CutHE(arr, 8, 5), R1); fprintf(fp1,"%s\n",R1); } } fclose(fp); fclose(fp1); _getch(); return 0; } 我把代码贴上 这次加上了编码的转换 有点看不懂您的回答
ckc 2017-08-29
  • 打赏
  • 举报
回复
用一些可以转换编码的编辑工具看看存盘的是不是utf8的格式 如果是的话要转码成gbk再存盘,抓网页的东西肯定要处理编码的 看你的例子似乎是你的程序还有问题,并不是编码的问题
赵4老师 2017-08-29
  • 打赏
  • 举报
回复
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧