繁体   English   中英

无法在 JTextArea 中显示特定(cyryllic 等)字符

[英]Unable to display specific(cyryllic etc.) characters in JTextArea

我正在尝试在 JTextArea 中显示一些文本,其中一部分是 Cyryllic。 我收到的不是正确的字符,而是方框或问号。 我正在从中加载文本的文件看起来像这样 - “波兰语单词 - 俄语单词”并以 UTF-8 编码。 我已经尝试了几种解决方案,这些解决方案包含在我的代码注释中。 编辑:通过 System.out.println("") 在控制台中显示文本没有问题;

 import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.Toolkit;
    import java.awt.event.FocusEvent;
    import java.awt.event.FocusListener;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Scanner;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;

    public class TextDemo extends JFrame implements FocusListener {
        JTextArea jTextArea;
        JScrollPane jCrollPane;
        JButton nextButton;
        ArrayList<String> arrayListPL = new ArrayList<String>();
        ArrayList<String> arrayListRU = new ArrayList<String>();
        //x,y used for getting specific String from the ArrayLists
        int x = 0;
        int y = 0;

        public static void main(String[] args) throws IOException {
            TextDemo mainRunner = new TextDemo();
            mainRunner.RepeatMethod();
        }
        public void RepeatMethod() throws IOException {
            // System.out.println(System.getProperty("file.encoding"));
            // System.setProperty("file.encoding", "UTF-8");
            Repeat();
            TextDemo runner = new TextDemo();
            runner.Repeat();
            runner.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            runner.CreateWindow();
        }

        private void CreateWindow() {

            setSize(400, 600);
            setTitle("Powtórka");
            setResizable(false);
            setVisible(true);
            Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
            this.setLocation(dim.width / 2 - this.getSize().width / 2, 
            dim.height / 2 - this.getSize().height / 2);
            jTextArea = new JTextArea();
            jCrollPane = new JScrollPane(jTextArea);
            jCrollPane.setBounds(0, 0, 400, 500);
            jTextArea.setFont(new Font("Arial", Font.PLAIN, 12));
            add(jCrollPane);
            nextButton = new JButton("Next word");
            nextButton.setBounds(0, 500, 400, 100);
            nextButton.setSize(400, 100);
            add(nextButton, BorderLayout.PAGE_END);
            jTextArea.addFocusListener(this);

        }

        public void Repeat() throws IOException {

            File plik = new File("Source//of//the//file.txt");
            FileReader fr = new FileReader(plik);
            BufferedReader br = new BufferedReader(fr);
            String line;


            String[] split;
            String wordRU, wordPL;
            while ((line = br.readLine()) != null) {
                // Dividing the pair of words
                split = line.split("-");
                wordRU = split[0].trim();
                wordPL = split[1].trim();
                wordRU = new String(wordRU.getBytes("Cp1250"), "UTF-8");
                wordPL = new String(wordPL.getBytes("Cp1250"), "UTF-8");
                arrayListPL.add((wordPL));
                arrayListRU.add((wordRU));

            }

            br.close();

        }

        @Override
        public void focusGained(FocusEvent arg0) {

            jTextArea.setText(jTextArea.getText() + "\n" + 
            arrayListPL.get(x));
            if (x < arrayListPL.size()) {
                x++;
            }
        }

        @Override
        public void focusLost(FocusEvent arg0) {
            jTextArea.setText(jTextArea.getText() + "\n" + 
            arrayListRU.get(y));
            if (y < arrayListRU.size()) {
                y++;
            }
        }

    }

您正在使用FileReader读取文件,这个便利类假定文本文件采用“平台默认编码”,无论您的机器上是什么。

您最好使用InputStreamReader ,您可以在其中明确指定文件编码为“UTF-8”,以匹配您的文件。

你的代码行

            wordRU = new String(wordRU.getBytes("Cp1250"), "UTF-8");
            wordPL = new String(wordPL.getBytes("Cp1250"), "UTF-8");

那么应该没有必要。

我删除了线条

        wordRU = new String(wordRU.getBytes("Cp1250"), "UTF-8");
        wordPL = new String(wordPL.getBytes("Cp1250"), "UTF-8");

并单击文本字段,它正确显示了 file.txt 中的所有单词,包括西里尔字母和波兰语字母。 没有进行其他更改。

我解决了:) 问题出在加载的文件上。 我在另一个类中更改了写入文件的方式:

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("source\\of\\file"), StandardCharsets.UTF_8);
                BufferedWriter writer = new BufferedWriter(osw);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM