2

我决定编写一个列出所有文件和目录的程序,但是在处理非英文文件名时遇到了问题。

问题是我的程序不能保证这些目录和文件名是英文的,如果某些文件名使用日文或中文字符,它会将一些字符显示为“?”。

J2SE 提供了多种 java.io.File list() 函数:https ://docs.oracle.com/javase/1.5.0/docs/api/java/io/File.html 。

但它似乎不处理非英文文件名。

有没有人有同样的问题?我应该向哪个方向寻找解决方案?

我搜索了诸如“java list non-english filename”、“java.io.file list non-english filename”之类的关键字,但不幸的是我找不到解决方案。

我希望人们给我一些想法,无论是在谷歌搜索关键字,还是程序方向。

谢谢~

4

3 回答 3

2

从 Java 向 Windows 命令提示符发出“国际”字符的问题有三个:

  1. 默认光栅字体不支持
  2. 默认的 8 位代码页可以追溯到 DOS 时代,与系统上的默认 Windows 编码不同
  3. Java ( System.out ) 以默认操作系统编码对输出进行编码,这在 Windows 上将是一个固有的有损过程

要让 Java 发出字符,可以:

  1. 安装MUI并切换到允许您想要的字符的设置(您可能仍需要使用chcp来切换编码)
  2. 将控制台切换到包含字符的 Unicode TrueType 字体并使用本机方法 ( WriteConsoleW ) 发出文本。

解释一切的链接:


在 Swing 下显示字符可能会更好。您可以使用这样的应用程序来测试 Swing 可用的字体,以查看它们是否呈现您的角色:

public class FontTest {

  // a Cyrillic and two CJK characters    
  private final String filename = "\u044F\u4E10\u4E20.txt";

  private ComboBoxModel createModel() {
    GraphicsEnvironment genv = GraphicsEnvironment
        .getLocalGraphicsEnvironment();
    Vector<Font> fonts = new Vector<Font>();
    for (Font font : genv.getAllFonts()) {
      Font newFont = new Font(font.getFontName(), font
          .getStyle(), 12);
      fonts.add(newFont);
    }
    DefaultComboBoxModel model = new DefaultComboBoxModel(
        fonts);
    return model;
  }

  private JFrame createGui() {
    final JLabel label = new JLabel();
    label.setText(filename);

    final JComboBox combo = new JComboBox();
    combo.setEditable(false);
    combo.setModel(createModel());
    combo.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        Font font = (Font) combo.getSelectedItem();
        label.setFont(font);
      }
    });

    label.setFont((Font) combo.getItemAt(0));

    JFrame frame = new JFrame();
    Container contentPane = frame.getContentPane();
    contentPane.setLayout(new GridLayout(0, 1));
    contentPane.add(label);
    contentPane.add(combo);
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    return frame;
  }

  public static void main(String[] args) {
    JFrame frame = new FontTest().createGui();
    frame.setVisible(true);
  }

}

XP 下的 Java 6 使用默认的 JLabel 字体完美显示所有字符(Dialog - 这是一个映射到其他东西的逻辑名称,因此您不会在charmap 中看到它)。

于 2009-03-28T14:08:19.437 回答
0

你如何显示文件名?问题可能在于显示而不是获取字符串。

我建议您打印出每个字符的 Unicode 值(用于charAt()获取每个字符,然后将其转换为int)并将它们与Unicode 代码图表进行比较。

于 2009-03-28T11:04:50.173 回答
-1

字符串是 Java 中的 Unicode(如文档所说的 utf-16)。所以只需像这样传递文件名。当然,底层操作系统应该支持这一点。

于 2009-03-28T10:58:45.243 回答