我正在编写一个小应用程序,应该从用户那里收到一些英文和俄文文本,然后对其进行一些处理。如果可能的话,我宁愿将两者都保留在字符串上。
我现在尝试这样做的方式涉及使用swing lib编写的GUI,特别是JTextField。
对于英文字符串,这样可以正常工作。然而,俄罗斯弦乐队继续作为“???????”出现。我觉得我在编码时做错了什么,但我找不到任何关于我应该做些什么的资源。
以下是代码:
JLabel name_ru;
JTextField name_russian;
public Gui()
{
name_ru = new JLabel("Name in Russian:");
name_russian = new JTextField();
}
public void run()
{
ru_name = name_russian.getText();
System.out.println(ru_name);
}
实际上将JTextField添加到基于JFrame的GUI后,我能够提示将JTextField.getText()字符串打印到consol并使用BufferedWriter将其保存到txt文件。如果JTextField中的文本是英文的,我没有这样做的问题。但是,只要我用俄语文本(或任何非英语文本)尝试它,我的输出就会显示为“??????????”。文本进入JTextField的方式很简单,用户在GUI运行时输入它。
我环顾四周,但是这里发布的解决方案(或我能找到的任何其他地方)似乎都没有处理JTextField类 - 似乎.getText()返回一个编码错误的字符串。有没有办法改变它?救命啊!
谢谢你, 埃里克。
答案 0 :(得分:4)
这几乎可以肯定不是一个带Swing的程序。 getText()
将返回一个普通的Java String,它始终是一系列UTF-16代码单元。
并使用BufferedWriter将其保存到txt文件
这可能是个问题。我的猜测是您使用的是FileWriter
,或仅使用OutputStreamWriter
平台默认编码。
您应该使用OutputStreamWriter
(包裹FileOutputStream
)但指定编码 - 理想情况下为UTF-8。 UTF-8可以表示Unicode中的所有字符。
你还没有说过你在哪里查看输出 - 你只是说它“出来了”。如果您使用记事本或类似的东西来查看文件,您可能还需要在那里指定编码。
答案 1 :(得分:3)
System.out.println(ru_name);
将无法使用默认控制台设置打印UTF-8(俄语)字符。因此它是印刷???对于角色。确保用于显示输出的控制台以UTF-8编码。如果您正在使用eclipse,请转到
Run Configuration > Common -> Encoding
并从下拉菜单中选择UTF-8。