【C】转译日文乱码+右键上下文快速操作

本文介绍了如何使用C语言的iconv函数将日文系统中的文件名从Shift_JIS编码转换为GBK编码,以解决在中文系统下显示乱码的状况。主要涉及iconv函数的使用方法,包括头文件引用、参数传递及注意事项。通过示例代码展示了如何将C程序转化为可执行文件,实现一键转换文件名的功能。同时,对于VScode的编码问题给出了相应解决方案。
摘要由CSDN通过智能技术生成

【项目介绍】

本项目调用头文件<iconv.h>中的iconv函数以解决日文系统编写的文字在中文系统下显示为乱码的问题,参考文章:
c语言使用iconv函数实现字符编码转换
iconv函数详细解释
本项目仅研究文件名是乱码的情况,至于日文程序、游戏里乱码的问题不在研究之中。

【函数解析】

  1. 需包含头文件。若在编译时出现问题,尝试在编译声明添加以下项:
    在这里插入图片描述
  2. iconv函数
    详情见参考文章
    这个函数的特点是会改变输入的后四个参数(改变指针),返回的值都是没用的。原来的指针指向的字符串会被转码,但由于输入的指针会被修改,必须提前备份原指针,否则就没法找到被转码后的字符串了。
  3. 主体算法
#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;
}
  1. 注意点
    如果你是用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 来添加右键菜单
在这里插入图片描述
非常简单方便,下图是使用效果
在这里插入图片描述

【后记】

可执行文件下载链接
转载请注明来源

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值