我决定编写一个列出所有文件和目录的程序,但是在处理非英语文件名时遇到问题。
问题是我的程序不能保证这些目录和文件名是英文的,如果某些文件名使用日语或中文字符,它将显示某些字符为'?'。
J2SE提供了各种java.io.File list()函数:https://docs.oracle.com/javase/1.5.0/docs/api/java/io/File.html。
但是似乎不处理非英语文件名。
有人遇到同样的问题吗?我应该寻找什么方向的解决方案?
我用谷歌搜索了诸如“ java列表非英语文件名”,“ java.io.file列表非英语文件名”之类的关键字,但不幸的是我找不到解决方案。
无论人们在Google中搜索关键字还是在程序指导中,我都希望人们给我一些想法。
谢谢〜
从Java向Windows命令提示符发出“国际”字符的问题有三方面:
要使Java发出字符,可以:
解释这一切的链接:
您可能会有更好的运气在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中看到它)。
您如何显示文件名?问题可能出在显示而不是获取字符串上。
我建议您打印出每个字符的Unicode值(使用charAt()
获取每个字符,然后将其转换为int
),然后将它们与Unicode code charts进行比较。
字符串是Java中的Unicode(文档表示为utf-16)。因此,只需传递文件名即可。当然底层的操作系统应该支持这一点。