我正在尝试在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++;
}
}
}
答案 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);