【项目介绍】
本项目调用头文件<iconv.h>中的iconv函数以解决日文系统编写的文字在中文系统下显示为乱码的问题,参考文章:
c语言使用iconv函数实现字符编码转换
iconv函数详细解释
本项目仅研究文件名是乱码的情况,至于日文程序、游戏里乱码的问题不在研究之中。
【函数解析】
- 需包含头文件。若在编译时出现问题,尝试在编译声明添加以下项:
- iconv函数
详情见参考文章
这个函数的特点是会改变输入的后四个参数(改变指针),返回的值都是没用的。原来的指针指向的字符串会被转码,但由于输入的指针会被修改,必须提前备份原指针,否则就没法找到被转码后的字符串了。 - 主体算法
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iconv.h>
int main()
{
char* in = "嵟弶偵偍撉傒偔偩偝偄";
iconv_t cd = iconv_open("gbk", "shift_jis");
char* inbuf = in;
size_t inbytesleft = strlen(in);
char* outbuf = (char*)malloc(100);
size_t outbytesleft = 100;
memset(outbuf, 0, outbytesleft);
char* out = outbuf;
if (iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft) == (size_t)-1) {
printf("this error!\n");
iconv_close(cd);
return 0;
}
printf("%s\n", out);
iconv_close(cd);
system("pause");
return 0;
}
- 注意点
如果你是用VScode,会发生输出的还是乱码的问题,这时直接运行本地编译好的exe文件即可,看到的就是正常日文。
这可能是因为VScode的编码保存方式和系统不一样,如果将 iconv_open 第一个参数改成 utf-8 ,则VScode会显示正常日文,但本地exe文件运行后又会显示乱码,这里就以本地文件显示为准。
【可执行文件】
上述代码只是C程序,题者想要的效果是:右击文件,在上下文菜单上选择【转码文件名】,然后一键改名,所以必须将C程序改造成可执行文件
拖动乱码名文件到下述代码编译成的exe文件上,即可自动改名。
#include <stdlib.h>
#include "ShiftJis2GBK.h"
int main(int argc, char *argv[])
{
if(argc==1) return 0;
char* out = (char*)malloc(BUFSIZE);
for(int i=1; i<argc; i++){
char* FileName = strrchr(argv[i],'\\')+1;
memset(out, 0, BUFSIZE);
ShiftJis2GBK(FileName, out);
rename(argv[i],out);
}
free(out);
return 0;
}
添加到右键菜单
由于题者懒得学注册表修改,直接用便捷软件 ContextMenuManager 来添加右键菜单
非常简单方便,下图是使用效果
【后记】
可执行文件下载链接
转载请注明来源