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」などのキーワードをグーグル検索しましたが、残念ながら解決策が見つかりません。

Google でキーワードを検索する場合でも、プログラムの指示を検索する場合でも、人々が私に何らかの考えをもたらしてくれることを願っています。

ありがとう〜

4

3 に答える 3

2

JavaからWindowsコマンドプロンプトに「国際的な」文字を出力する際の問題は3つあります。

  1. デフォルトのラスターフォントはそれをサポートしていません
  2. デフォルトの8ビットコードページはDOS時代にさかのぼり、システムのデフォルトのWindowsエンコーディングと同じではありません
  3. Java(System.out)は、デフォルトのオペレーティングシステムエンコーディングで出力をエンコードします。これは、Windowsでは本質的に損失の多いプロセスになります。

Javaに文字を出力させるには、次のいずれかを実行します。

  1. MUIをインストールし、必要な文字を許可する設定に切り替えます(エンコードを切り替えるには、 chcpを使用する必要がある場合があります)
  2. コンソールを文字を含むUnicodeTrueTypeフォントに切り替え、ネイティブメソッド(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でのJava6は、デフォルトのJLabelフォントを使用してすべての文字を完全に表示します(ダイアログ-他のものへの論理名マッピングであるため、charmapでは表示されません)。

于 2009-03-28T14:08:19.437 に答える
0

ファイル名をどのように表示していますか?文字列を取得するのではなく、ディスプレイに問題がある可能性があります。

各文字の Unicode 値を出力し ( を使用charAt()して各文字を取得し、それを に変換します)、それらをUnicode コード チャートintと比較することをお勧めします。

于 2009-03-28T11:04:50.173 に答える
-1

Java では、文字列は Unicode (ドキュメントによると utf-16) です。そのため、ファイル名をそのまま渡します。もちろん、基盤となる OS はこれをサポートする必要があります。

于 2009-03-28T10:58:45.243 に答える