Java FileOutputStream将文件名与系统中的其他字符集一起保存

时间:2014-02-18 15:19:06

标签: java file-io unicode

我在使用FileOutputStream时遇到文件名字符集问题。

我的代码非常简单,请使用

FileOutputStream

使用File对象作为参数。

但在我的应用程序中,路径文件在System.out.println()调用上打印正确。

但是在磁盘上,它是使用另一个字符集保存的(我不知道是什么)。

例如:在System.out.println上,输出为:

C:\Folder\MyLatinNameWithÇorÃorAnotheLatinChar

但在实际磁盘文件名中,名称是:

C:\Folder\MyLatinNameWithçorãorAnotheLatinChar

发生了什么事?

对于noob问题感到抱歉,但我确实遇到了问题。

1 个答案:

答案 0 :(得分:0)

System.out不是很值得信赖。

最好直接检查字符串以查看它是否正确:

  private static void debugPrint(String str) {
    for (char ch : str.toCharArray()) {
      if (ch < ' ' || ch > '~') {
        System.out.format("\\u%04x", (int) ch);
      } else {
        System.out.print(ch);
      }
    }
  }

它将打印可见ASCII范围之外的任何转义格式 - Ç变为\u007c。然后,您可以针对BMP检查the charts值,以查看字符串中的内容。


这里的麻烦可能延伸到Windows中游戏中的字符编码数量:

  • "OEM"(早于Windows) - 默认为cmd.exe
  • "ANSI"(在Windows中引入) - 记事本中的默认值
  • “Unicode”(UTF-16LE - 通过Windows NT线路普及)

除了Unicode之外的其他所有内容都已弃用,其他所有内容都是为了向后兼容性原因而闲置的,但却经常为不谨慎的人破坏数据。引入Java时,Unicode的采用并不普遍,ANSI default platform encodings在Windows上仍然存在。

检查system properties也是一个想法。有些devrlopers提供file.encoding属性,但从默认值not supported更改它可能会对本机代码调用产生负面影响。