首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java.io.File列表非英语文件名

java.io.File列表非英语文件名
EN

Stack Overflow用户
提问于 2009-03-28 10:57:09
回答 3查看 4.1K关注 0票数 2

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

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

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

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

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

我在谷歌上搜索了"java.io.file列表非英语文件名“、"java列表非英语文件名”等关键字,但不幸的是我找不到解决方案。

我希望人们带给我一些想法,无论是在google中搜索关键字,还是程序说明。

谢谢~

EN

回答 3

Stack Overflow用户

发布于 2009-03-28 14:08:19

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

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

要让Java发出字符,请执行以下任一操作:

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

解释这一切的链接:

  • I18N: Unicode at the Windows command prompt (C++; .Net; Java)
  • Java: Unicode on the Windows command line

您可能会更幸运地在Swing下显示字符。您可以使用这样的应用程序来测试Swing可用的字体,以查看它们是否渲染您的字符:

代码语言:javascript
复制
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下的Java6使用默认的对话框字体完美地显示所有字符( JLabel -这是一个映射到其他内容的逻辑名称,因此您不会在charmap中看到它)。

票数 2
EN

Stack Overflow用户

发布于 2009-03-28 11:04:50

如何显示文件名?问题很可能出在显示器上,而不是获取字符串。

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

票数 0
EN

Stack Overflow用户

发布于 2009-03-28 10:58:45

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/692606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档