You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在EUC-KR编码系统下用Java读取UTF-8编码的文件名?

解决Java读取UTF-8文件名(系统为EUC-KR编码)的问题

这个问题我之前处理过,核心原因是Java旧版File API依赖JVM默认字符编码,而你的系统默认是EUC-KR,当文件名实际是UTF-8编码时,用EUC-KR去解码UTF-8字节会导致文件名乱码——乱码后的文件名对应不上系统里真实的文件路径,所以isFile()和isDirectory()都会返回false,因为JVM找不到这个“不存在”的文件。

下面给你两个可行的解决方案:

方案一:使用NIO的Path和Files API(推荐)

Java 7引入的NIO API对文件名编码的支持更灵活,能更好地适配不同编码的文件名,不需要依赖系统默认编码。示例代码如下:

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class Utf8FileReader {
    public static void main(String[] args) {
        String dirPath = "你的目标目录路径";
        Path dir = Paths.get(dirPath);
        
        // 遍历目录下的所有文件/目录
        try (Stream<Path> pathStream = Files.list(dir)) {
            pathStream.forEach(path -> {
                // 获取正确编码的文件名
                String fileName = path.getFileName().toString();
                System.out.println("文件名:" + fileName);
                // 正确判断文件/目录类型
                System.out.println("是否为文件:" + Files.isRegularFile(path));
                System.out.println("是否为目录:" + Files.isDirectory(path));
                System.out.println("---");
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这个方案不依赖系统编码,能直接正确识别UTF-8编码的文件名,而且NIO API本身也比旧的File API更健壮。

方案二:修改JVM启动参数(兼容旧代码)

如果你必须继续使用File API,可以在启动Java程序时添加以下JVM参数,强制JVM用UTF-8处理文件名和文件内容:

-Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8
  • sun.jnu.encoding是JVM处理文件名的编码参数
  • file.encoding是处理文件内容的编码参数

注意:这个参数是Oracle JVM的特定参数,其他JVM(比如OpenJDK)虽然大部分也支持,但可能存在兼容性问题,所以优先推荐方案一。

另外,你之前尝试的new String(fileList[0].getName().getBytes("euc-kr"), "euc-kr")是无效的,因为文件名已经被JVM用EUC-KR解码错误了,再转一次编码也无法还原正确的UTF-8文件名。

内容的提问来源于stack exchange,提问作者이진희

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:25:05