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

时间:2019-01-13 11:37:19

标签: java character decode 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++;
            }
        }

    }

3 个答案:

答案 0 :(得分:1)

您正在使用FileReader读取文件,并且此便捷类假定文本文件采用的是“平台默认编码”,无论您的计算机上是什么。

最好使用InputStreamReader,在此处可以将文件编码明确指定为“ UTF-8”,以匹配文件。

您的代码行

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

那么就没有必要了。

答案 1 :(得分:0)

我删除了行

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

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

答案 2 :(得分:0)

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

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