有谁会,使用 Java 打开一个 文件名是 GBK 编码的文件?(在系统编码为 UTF-8 的 Linux 下,不能使用 convmv 进行文件名转码)

2023-03-09 13:56:11 +08:00
 string2020
2565 次点击
所在节点    程序员
31 条回复
leonshaw
2023-03-09 23:23:39 +08:00
@AoEiuV020CN 打开文件拿到 fd 以后应该就可以直接用 java.io 再打开 /proc/self/fd/x 了
tramm
2023-03-10 08:32:47 +08:00
有啥问题?
先把 utf8 的文件名转成 gbk 的 string, 然后再用 gbk 的 string 去访问不就行了嘛.

我用下面的试了下, 可以访问的啊, 还是说我理解错了你的意思?(FileUtil 是 HuTool 中的)

@Test
public void charsetTest(){
String content = "草泥马";
byte[] gbks = content.getBytes(Charset.forName("GBK"));

// gbk 在 UTF8 下的字符串表示
String gbkInUtf8 = StrUtil.str(gbks, StandardCharsets.UTF_8);
log.info(gbkInUtf8); // ������
FileUtil.writeUtf8String("fuck", "F:\\Projects\\Learn\\JavaProjects\\aio-learn\\Logs\\"+gbkInUtf8+".txt");

String s1 = FileUtil.readUtf8String("F:\\Projects\\Learn\\JavaProjects\\aio-learn\\Logs\\" + gbkInUtf8 + ".txt");
log.info(s1);

List<String> fileNames = FileUtil.listFileNames("F:\\Projects\\Learn\\JavaProjects\\aio-learn\\Logs");
for (String fileName : fileNames) {
String s = FileUtil.readString("F:\\Projects\\Learn\\JavaProjects\\aio-learn\\Logs\\" + fileName, StandardCharsets.UTF_8);
log.info("{} - {}",fileName,s);
}
}
tramm
2023-03-10 08:34:04 +08:00
@tramm
打印:
2023-03-10 08:27:31.489 [main] [INFO ] com.wdnj.xxb.jtt.CommonTest - ������
2023-03-10 08:27:31.492 [main] [INFO ] com.wdnj.xxb.jtt.CommonTest - fuck
2023-03-10 08:27:31.497 [main] [INFO ] com.wdnj.xxb.jtt.CommonTest - ������.txt - fuck
AoEiuV020CN
2023-03-10 09:01:21 +08:00
@tramm 按道理是这样的,但是你离开 java 再看看这个文件名的十六进制,压根不是 gbk 编码的汉字,
string2020
2023-03-10 09:25:11 +08:00
@billlee 改了编码,日志什么的其他操作是不是也受到到影响
string2020
2023-03-10 09:25:38 +08:00
@jorneyr 是文件名的编码不对,文件 exists 都不存在。
string2020
2023-03-10 09:26:13 +08:00
@felixlong 已经用 convmv 处理了,有空我试试
string2020
2023-03-10 09:26:53 +08:00
@AoEiuV020CN 确实蛋疼
string2020
2023-03-10 09:28:04 +08:00
@xiangyuecn 复制出来的是 gbk 编码的字符转为 utf8 的字符,也就是乱码。用乱码怎么找文件,exists 直接不存在
string2020
2023-03-10 09:32:12 +08:00
@tramm 转为 utf8 后的 gbk 字符是乱码,java 去访问文件的时候是找不到的,因为系统里没有文件名为乱码的文件。你用的这个文件是你以乱码为名新建的文件。实际我现在的文件是 gbk 编码的文件名,也就是名字只是编码不对,而不是乱码的名字。你在系统里直接建一个文件,用 convmv 转为 gbk ,再用你的方法访问,是访问不到的。
string2020
2023-03-10 09:36:04 +08:00
@AoEiuV020CN 确实能用 bytes 当文件名就能解决。太蛋疼,把现有文件全部 convmv 了。以后保存文件就保存为 utf8.文件都是 ftp 上来的,ftp 的编码没设置好,导致 window 上来的文件名都是 gbk.现在改成 utf8 后,用 ftp 客户端读取,文件名又全是乱码,需要设置为强制 utf8 才能正常。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/922567

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX