java.io.File列出非英文文件名

时间:2009-03-28 10:57:09

标签: java filenames

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

问题是我的程序无法保证这些目录和文件名是英文的,如果某些使用日文,中文字符的文件名会显示某些字符,如'?'。

J2SE提供各种java.io.File list()函数http://java.sun.com/j2se/1.4.2/docs/api/java/io/File.html

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

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

我使用“java list non-english filename”,“java.io.file list non-english filename”等关键字在google中搜索,但遗憾的是我无法找到解决方案。

希望人们为我带来一些想法,无论是在谷歌搜索关键词,还是编制方向。

感谢〜

3 个答案:

答案 0 :(得分:2)

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

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

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


      你可能会更好地在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字体完美显示所有字符(对话框 - 这是一个映射到其他东西的逻辑名称,所以你不会在charmap中看到它。)

答案 1 :(得分:0)

您是如何显示文件名的?有可能问题在于显示而不是取出字符串。

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

答案 2 :(得分:-1)

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