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

Java 无法在JTextArea中显示特定(cyryllic等)字符,java,character,decode,jtextarea,Java,Character,Decode,Jtextarea,我试图在JTextArea中显示一些文本,其中一部分是用cyryllic编写的。 我收到的不是正确的字符,而是方框或问号。 我从中加载文本的文件看起来是这样的——“波兰语单词-俄语单词” 并以UTF-8编码。 我尝试了几种在代码注释中包含的解决方案。 编辑:通过System.out.println(“”)在控制台中显示文本没有问题 导入java.awt.BorderLayout; 导入java.awt.Dimension; 导入java.awt.Font; 导入java.awt.Toolkit;

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

导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.Font;
导入java.awt.Toolkit;
导入java.awt.event.FocusEvent;
导入java.awt.event.FocusListener;
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.FileReader;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.Scanner;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTextArea;
公共类TextDemo扩展JFrame实现FocusListener{
JTextArea JTextArea;
JScrollPane jCrollPane;
JButton nextButton;
ArrayList arrayListPL=新的ArrayList();
ArrayList ArrayList=新的ArrayList();
//x、 y用于从ArrayList获取特定字符串
int x=0;
int y=0;
公共静态void main(字符串[]args)引发IOException{
TextDemo mainlunner=新建TextDemo();
mainRunner.RepeatMethod();
}
public void RepeatMethod()引发IOException{
//System.out.println(System.getProperty(“file.encoding”);
//System.setProperty(“file.encoding”、“UTF-8”);
重复();
TextDemo runner=newtextdemo();
runner.重复();
runner.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
runner.CreateWindow();
}
私有void CreateWindow(){
设置大小(400600);
setTitle(“Powtórka”);
可设置大小(假);
setVisible(真);
维度dim=Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation(dim.width/2-this.getSize().width/2,
dim.height/2-此.getSize().height/2);
jTextArea=新的jTextArea();
jCrollPane=新的JScrollPane(jTextArea);
jCrollPane.setBounds(0,040500);
setFont(新字体(“Arial”,Font.PLAIN,12));
添加(jCrollPane);
下一个按钮=新的按钮(“下一个单词”);
下一个按钮。设置边界(0500400100);
下一个按钮设置大小(400100);
添加(下一个按钮,边框布局。页面_结尾);
jTextArea.addFocusListener(this);
}
public void Repeat()引发IOException{
File plik=新文件(“Source//of//File.txt”);
FileReader fr=新的FileReader(plik);
BufferedReader br=新的BufferedReader(fr);
弦线;
字符串[]拆分;
字符串wordRU,wordPL;
而((line=br.readLine())!=null){
//分词
拆分=行。拆分(“-”);
wordRU=split[0]。trim();
wordPL=split[1]。trim();
wordRU=新字符串(wordRU.getBytes(“Cp1250”),“UTF-8”);
wordPL=新字符串(wordPL.getBytes(“Cp1250”),“UTF-8”);
arrayListPL.add((wordPL));
arrayListRU.add((wordRU));
}
br.close();
}
@凌驾
已获得公共无效焦点(焦点事件arg0){
jTextArea.setText(jTextArea.getText()+“\n”+
arrayListPL.get(x));
if(x
您正在使用
文件读取器读取文件,该便利类假定文本文件采用“平台默认编码”,不管您的计算机上有什么

您最好使用
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);

我创建了包含内容的文件“file.txt”,运行了您的代码,但只能看到空窗口。请创建最小工作程序,以字符串作为常量,而不是从文件中获取。@AlexeiKaigorodov这是一个工作版本,只有控件非常原始。为了显示任何内容,您需要关注按钮或文本字段。
新字符串(wordRU.getBytes(“Cp1250”),“UTF-8”)
是一种货物重编码:看起来它可能会做一些有意义的事情,而实际上,当它做任何事情时,它几乎从来都不是预期的。。。
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("source\\of\\file"), StandardCharsets.UTF_8);
                BufferedWriter writer = new BufferedWriter(osw);