20220422 update:

1. 修复文件路径含有空格时复制地址会自动包裹双引号导致路径识别失败的问题

20220424 update:

1. 修复文件地址中某些特殊符号超出cmd默认编码范围导致路径识别失败的问题

dlsite下载的压缩包,以及其他很多日语文件,都会存在乱码问题。解决方法当然也很多,比如一些压缩软件可以自选语言编码,比如自解压文件可以像你玩galgame一样用转区软件打开,或者……像我一样长期用最笨的方法——复制、粘贴、转码,不是因为我不厌其烦,只是我真的不喜欢装软件。

但是,当我面对一个目录内有几十个乱码文件,再加上win11卡到爆的资源管理器的时候,我终于崩溃了!于是,我写了这个批量转换工具。类似的工具其实早就有人做过,可惜年代久远,网盘失效……不得不自己动手。

下载地址

使用例1:

使用例2:

重要提醒

使用时请务必谨慎,如果造成重要文件损坏或丢失,本人概不负责!

练习忠字舞中,少话

积分: 19

源码丢

using System;
using System.Text;
using System.IO;

namespace CodeConvert
{
    class CodeConvert
    {
        static Encoding srcCode = Encoding.GetEncoding("GB18030");
        static Encoding dstCode = Encoding.GetEncoding("shift_jis");
        static void Main(string[] args)
        {
            string folder;
            DirectoryInfo dir;
            Console.InputEncoding = Encoding.Unicode;
            do
            {
                Console.WriteLine("请输入运行模式");
                Console.WriteLine("1:转换单个文件内容");
                Console.WriteLine("2:转换单个文件名");
                Console.WriteLine("3:转换单个文件夹名");
                Console.WriteLine("4:转换目录下所有文件名");
                Console.WriteLine("5:转换目录下所有文件夹名...");

                string mode = Console.ReadLine();
                if (mode == "1" || mode == "2")
                {
                    Console.WriteLine("请输入文件地址...");
                    Console.WriteLine();
                    string file = Console.ReadLine();
                    file = file.Trim(new char[] { '\'', '\"' });
                    if (File.Exists(file))
                    {
                        try
                        {
                            if (mode == "1")
                                WriteContent(file, EncodingConvert(srcCode, dstCode, ReadContent(file)));
                            else
                            {
                                var fi = new FileInfo(file);
                                fi.MoveTo(Path.Combine(fi.DirectoryName, EncodingConvert(srcCode, dstCode, fi.Name.Split('.')[0]) + fi.Extension));
                            }
                            Console.WriteLine("转换完成");
                            Console.WriteLine();
                            Console.WriteLine("----------------------------");
                            Console.WriteLine();
                        }
                        catch
                        {
                            Console.WriteLine("未知错误已发生");
                            Console.WriteLine();
                            Console.WriteLine("----------------------------");
                            Console.WriteLine();
                        }
                    }
                    else
                    {
                        Console.WriteLine("请输入合法地址!");
                        Console.WriteLine();
                        Console.WriteLine("----------------------------");
                        Console.WriteLine();
                    }
                }
                else if (mode == "3")
                {
                    Console.WriteLine("请输入文件夹地址...");
                    Console.WriteLine();
                    folder = Console.ReadLine();
                    folder = folder.Trim(new char[] { '\'', '\"' });
                    dir = new DirectoryInfo(folder);
                    if (dir != null)
                    {
                        dir.MoveTo(Path.Combine(dir.Parent.FullName, EncodingConvert(srcCode, dstCode, dir.Name)));
                        Console.WriteLine("转换完成");
                        Console.WriteLine();
                        Console.WriteLine("----------------------------");
                        Console.WriteLine();
                    }
                    else
                    {
                        Console.WriteLine("请输入合法地址!");
                        Console.WriteLine();
                        Console.WriteLine("----------------------------");
                        Console.WriteLine();
                    }
                }
                else if (mode == "4" || mode == "5")
                {
                    Console.WriteLine("请输入父目录路径...");
                    Console.WriteLine();
                    folder = Console.ReadLine();
                    folder = folder.Trim(new char[] { '\'', '\"' });
                    dir = new DirectoryInfo(folder);
                    if (dir != null)
                    {
                        try
                        {
                            if (mode == "4")
                            {
                                FileInfo[] fileInfos = dir.GetFiles();
                                foreach (var item in fileInfos)
                                {
                                    item.MoveTo(Path.Combine(folder, EncodingConvert(srcCode, dstCode, item.Name.Split('.')[0]) + item.Extension));
                                }
                            }
                            else
                            {
                                DirectoryInfo[] dirInfos = dir.GetDirectories();
                                foreach (var item in dirInfos)
                                {
                                    item.MoveTo(Path.Combine(folder, EncodingConvert(srcCode, dstCode, item.Name)));
                                }
                            }
                            Console.WriteLine("转换完成");
                            Console.WriteLine();
                            Console.WriteLine("----------------------------");
                            Console.WriteLine();
                        }
                        catch
                        {
                            Console.WriteLine("未知错误已发生");
                            Console.WriteLine();
                            Console.WriteLine("----------------------------");
                            Console.WriteLine();
                        }
                    }
                    else
                    {
                        Console.WriteLine("请输入合法路径!");
                        Console.WriteLine();
                        Console.WriteLine("----------------------------");
                        Console.WriteLine();
                    }
                }
            } while (true);


        }
        /// <summary>
        /// 内码转换
        /// </summary>
        /// <param name="src">源编码格式</param>
        /// <param name="dst">目标编码格式</param>
        /// <param name="text">源字符串</param>
        /// <returns>转换后字符串</returns>
        public static string EncodingConvert(Encoding src, Encoding dst, string text)
        {
            var bytes = src.GetBytes(text);
            return dst.GetString(bytes);
        }

        /// <summary>
        /// 读取文件内容
        /// </summary>
        /// <param name="path">文件路径</param>
        /// <returns>文件内容字符串</returns>
        public static string ReadContent(string path)
        {
            string content;
            using (StreamReader sr = new StreamReader(path, srcCode))
            {
                content = sr.ReadToEnd();
                sr.Close();
            }
            return content;
        }

        /// <summary>
        /// 替换文件内容
        /// </summary>
        /// <param name="path">文件路径</param>
        /// <param name="content">新的内容</param>
        public static void WriteContent(string path, string content)
        {
            using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Write, FileShare.Write))
            {
                fileStream.SetLength(0);
                using (StreamWriter streamWriter = new StreamWriter(fileStream))
                {
                    streamWriter.Write(content);
                    fileStream.Flush();
                    streamWriter.Close();
                }
                fileStream.Close();
            }
        }
    }
}

练习忠字舞中,少话

积分: 19
10 天 后

n0099
简单试了一下,这个转不了乱码,因为它是根据字符的对应关系改变内码值,从而保持文字信息不变,转换编码。而乱码的文字信息是没有意义的,只要将内码值直接映射到另一字库。
.Net的Encoding.Convert()方法也是实现这一功能,我一开始用了,结果把乱码转成另一种乱码,反而多此一举。



练习忠字舞中,少话

积分: 19

    不强自自🎌 您到底在说什么,能不能别用中文术语名
    您上面c#代码中的Encoding.GetBytes()然后再Encoding.GetString()不就是把gb18030编码下的bytes变成shiftjis编码下的bytes吗,这跟iconv -f gb18030 -t shift_jis有区别吗

      n0099
      iconv -f gb18030 -t shift_jis
      等价于
      Encoding.GetBytes()→Encoding.Convert(gb18030, shift_jis, bytes)→Encoding.GetString()

      练习忠字舞中,少话

      积分: 19
        1 个月 后
        21 天 后