修改乱码文件名

当遇到因编码问题导致的乱码文件名时,可以通过编写Java程序进行批量修复。文章介绍了如何确定文件名的现有编码(如GBK)和原本的正确编码(如UTF-8或Shift_JIS),并提供了利用Java转换文件名编码的方法,包括处理Windows路径分隔符的注意事项,以及如何测试和批量应用修复程序。

下载了一些东西,发现文件名全都是乱码,好几百张图片也没法一个一个改。

写了一个Java程序,运行一下帮我修改过来。

  • 首先确定两个编码。
    • 一个是确定文件名现在的编码
      • 中文的win10 环境下文件名一般都是默认GBK编码
      • 因为文件拷贝过来的时候被系统用GBK的方式错误解码,才会出现乱码的现象
      • 当然,个别人的系统可能不是GBK,比如Linux的是UTF-8,经过修改设置的win10也可以是UTF-8
      • 可以打开命令提示符CMD,输入chcp命令,查看活动代码页编号,936就是GBK,65001就是UTF-8
    • 另一个是确定文件名本来应该是什么编码
      • 乱码最多的可能原文件是UTF-8(看你文件哪里来的,合理判断一下)
      • 比如我下载的就是日文的东西,最可能的编码是Shift_JIS或者windows-31J
  • 根据上方的推测进行测试
    • 复制几个文件名乱码的文件到一个新的空文件夹下
    • 将文件的路径名填入
      • 注意,windows下路径是以一个反斜杠“\”作为分隔符,但是程序中用一个反斜杠可能会将它后边的字符转义,反而让程序无法正确识别路径
      • 可以将反斜杠“\”替换成斜杠“/”,这是Unix系统的路径分隔符,windows是可以兼容识别的
      • 也可以再加一个反斜杠,变成“ \ \”,这样程序识别的时候就会转义出来一个反斜杠,不会误转义其他字符(Markdown格式两个反斜杠会被转义为一个,为了显示清楚我中间加了个空格)
    • 将当前系统文件名的编码填入getBytes()中,比如我填的就是"GBK"
      • String.getBytes(String decode)是获得该字符串在此编码格式下byte数组
    • 将推测出的文件名本来的正确编码填入new String(byte[], decode)的decode处,比如我填的"windows-31J"
      • new String(byte[], decode)使用decode编码将byte[]转换成字符串
    • 运行程序进行测试修改
      • 原文件的本来编码如果推测出错,修改的文件名就还会有乱码的情况
      • 比如我一开始推测的编码其实是Shift_JIS,后来发现仍然有一部分的乱码的情况后来换成Windows-31J才修改成功
  • 找到正确的编码后,将路径修改为想要修改的文件路径,进行批量修改
    • 注意,该路径下的所有文件必须都是一起的,相同编码格式,如果有后放进去的其他文件,这个文件将会被修改成乱码
  • 这个程序的原理以我的例子举例
    • 文件名是gbk编码,该乱码本应该是日文编码Windows-31J,将乱码用使它错误的编码格式获得正确的byte数组,再用正确的编码格式解析出该字符串,再给文件命名
  • 程序
import java.io.File;
import java.io.UnsupportedEncodingException;

/**
 * @Description:修改文件名的乱码问题
 * @Author:seirin
 */

public class refilename {
    /*
     * 通过递归得到某一路径下所有的目录及其文件
     */
    static void getNames(String filePath) throws UnsupportedEncodingException {
        File root = new File(filePath);
        File[] files = root.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {

                getNames(file.getAbsolutePath());

                System.out.println(changName(file.getAbsolutePath()) + ":" + file.getAbsolutePath());
            } else {

                System.out.println(changName(file.getAbsolutePath()) + ":" + file.getAbsolutePath());
            }
        }
    }

    /*
     * 修改文件名,成功返回true
     */
    public static boolean changName(String path) throws UnsupportedEncodingException {
        File oldfile = new File(path);
        // 获取当前文件名,转换编码得到新的文件名
        String newName = new String(oldfile.getName().getBytes("gbk"), "Windows-31J");
        System.out.println(newName);
        File newfile = new File(oldfile.getParent() + File.separator + newName);
        // 重命名
        return oldfile.renameTo(newfile);

    }

    public static void main(String[] args) {

        try {
            //更改文件的路径
            getNames("E:/game/123");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

### Linux 系统中因中文乱码导致的文件名拷贝解决方案 在 Linux 系统中遇到中文乱码问题通常是因为源文件和目标系统的编码方式不同所致。Windows 默认使用的 GB2312 编码与 Linux 的 UTF-8 编码存在差异,因此当文件从 Windows 移动到 Linux 时可能出现乱码现象。 #### 使用 `convmv` 工具解决文件名编码问题 为了有效解决这一问题,可以利用工具 `convmv` 将文件名从一种编码转换为另一种编码。以下是具体操作: 通过安装并配置 `convmv` 来实现文件名编码转换。该工具支持多种常用参数来完成复杂的字符集转换任务。例如: ```bash sudo apt-get install convmv ``` 执行命令前需确认原文件所用的具体编码形式以及期望的目标编码格式。假设原始文件名GBK 编码,希望将其转换至 UTF-8,则可运行如下指令: ```bash convmv -f gbk -t utf8 --notest /path/to/your/files/* ``` 此命令的作用是从 GBK 转换成 UTF-8 并实际应用更而不只是模拟测试[^2]。 #### 配置环境变量以支持更多语言包 另外,在某些情况下可能还需要调整系统级别的区域设置(Locale),从而更好地兼容不同的文字体系结构。可以通过修改 `/etc/default/locale` 或者直接临时设定 LOCALE 参数的方式来进行适配。例如增加对简体中文的支持可通过下面的方法之一达成: ```bash export LC_ALL=zh_CN.UTF-8 ``` 或者永久生效的话则应编辑相关配置文档加入类似以下行项: ```plaintext SUPPORTED="zh_CN.GB18030:zh_CN.GB2312:zh_CN.GBK:zh_CN.utf8..." ``` 这一步骤确保即使是在跨平台传输之后也能维持正常的视觉呈现效果[^3]。 综上所述,针对由 Windows 至 Linux 过程里产生的汉字失真状况,采取适当手段譬如运用专门软件如 `convmv` 结合必要的操作系统层面动能够很好地予以纠正[^1][^2]. ```python import os def check_locale(): locale = os.getenv('LC_ALL') if 'zh_CN' not in locale or 'UTF-8' not in locale: print("Your current locale may cause Chinese character issues.") check_locale() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值