使用日语输入java

时间:2013-06-04 20:30:12

标签: java string jframe store jlabel

我正在尝试将日语单词存储为字符串,但每次我尝试存储字符串时,我都会在字符应该出现问号。

例如,如果用户输入:こんにちは

String string = scan.next();
System.out.println(string);

它将显示五个问号,其中应显示五个字符。如果我将日语单词声明为字符串,虽然我可以显示单词。

离。

 String Kana = "こんにちは";
 System.out.println(Kana);

将显示こんにちは

我遇到与JLabels类似的问题,当我发送用户输入的单词时,我会收到问号,但是当我使用单词设置文本时,我设置它有效。我有显示日文文本的字体,所以我处于死胡同。

我相信一旦用户输入单词,文本就会发生一些事情,但我无法弄清楚是什么。我也使用netbeans,源文件在unicode编码,所以我不认为这是问题。

以下是完整代码:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package javaapplication1;

import java.awt.*;
import java.io.*;
import java.nio.charset.Charset;
import java.text.Normalizer;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Scanner;
import java.util.regex.Pattern;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
/**
 *
 * @author tyler.stanley.4937
 */
public class JavaApplication1 extends JFrame {
    /**
     * @param args the command line arguments
     */
    private final Charset UTF8_CHARSET = Charset.forName("UTF-8");
    File fontFile = new File("MSMINCHO.TTF");
    Font baseFont = null;
    Scanner scan=new Scanner(System.in,"UTF-8");
    JLabel japanese = new JLabel("Hello");

    public JavaApplication1(){
        //Locale.setDefault(new Locale("ja"));
        setSize(300,300);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container contentPane = getContentPane();
        JPanel panel = new JPanel(new FlowLayout());
        contentPane.add(panel);
        panel.add(japanese);
    }
    public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException, FontFormatException {
        // TODO code application logic here
        JavaApplication1 ja = new JavaApplication1();
        ja.start();
    }
    public void start() throws FileNotFoundException, IOException, ClassNotFoundException, FontFormatException{
        //Locale bLocale = Locale.forLanguageTag("ja-JP-u-ca-japanese");


        InputStream fontFileInputStream = new FileInputStream(fontFile);
        baseFont = Font.createFont(Font.TRUETYPE_FONT, fontFileInputStream);
        Font font = Font.createFont(Font.TRUETYPE_FONT, fontFile);
        font = font.deriveFont(Font.PLAIN, 14f);

        System.out.println("Enter Kanji");
        String string = new String(scan.next());
        StringBuffer sb = new StringBuffer(string);

        japanese.setFont(baseFont.deriveFont(Font.PLAIN, 24));
        japanese.setText(sb.toString());
        System.out.println("Enter Romanji");
        String Romanji = scan.next();
        System.out.println("How common is it");
        int common = scan.nextInt();
        System.out.println("How many types of word is it?");
        int loop = scan.nextInt();
        //List<int> typeOfWord = new ArrayList<int>();
        ArrayList type = new ArrayList();
        for(int i = 0; i<loop;i++){
            System.out.println("What type of word");
            type.add(scan.nextInt());
        }
        System.out.println("What type of adjective");
        int adjective = scan.nextInt();
        System.out.println("What type of verb");
        int verb = scan.nextInt();
        System.out.println("How many radicals");
        int loop2 = scan.nextInt();
         ArrayList radical = new ArrayList();
        Word word = new Word(sb.toString(),Romanji,common,type,adjective,verb,radical);
        word.getKanaKanji();// gives ?????
        store(word);

        read();

    }
    public void store(Word word) throws FileNotFoundException, IOException, FontFormatException{
        File file = new File("test.doc");
        File newfile = new File ("kanji.rtf");

        FileOutputStream ofs = new FileOutputStream(newfile);
        PrintWriter print = new PrintWriter(ofs);
        System.out.println("Add Kanji");
        String kanji = scan.next();
        print.write(kanji);
        print.close();


        FileOutputStream outFileStream = new FileOutputStream(file);
        ObjectOutputStream oos = new ObjectOutputStream(outFileStream);
        oos.writeObject(word);
        oos.close();
    }
}

当我打开我写的汉字的文件时,它会通过显示一堆问号来做同样的事情。问号的数量与字符数量相加,但如果我使用扫描仪或任何其他方法从用户那里获取文本,它们就不会显示。

1 个答案:

答案 0 :(得分:0)

嗯,要在标准输出中打印,请更改netbeans的编码设置或明确创建UTF-8流。

1部分:

第一部分取自答案here

import java.io.PrintStream;
import java.io.UnsupportedEncodingException;

public class JavaTest {

    public static void main(String[] args) {
        try{
            PrintStream out = new PrintStream(System.out, true, "UTF-8");
            String Kana = "こんにちは";
            out.println(kana);

        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

2部分: 好吧,要在JLabel中显示,请调用JLabel#setFont方法,将您系统上可用的字体名称传递给日语。有关更多信息,请参阅javadocs类的Font

示例:

 JLabel jl=new JLabel();
 jl.setFont(new Font(yourFontString,20,20));
 jl.setText(Kana);

修改:如果您的Scanner

出现问题

使用public Scanner(InputStream source,String charsetName)

示例:Scanner scan=new Scanner(System.in,"UTF-8");

修改

  

当我打开我写汉字的文件时,它也是一样的   的事情       显示一堆问号。问号的数量加起来就是字符的数量,但是如果我的话,它们就不会显示出来   使用扫描仪或任何其他        从用户那里获取文本的方法。

您将FileOutputStream包裹在PrintWriter中。您可以将其包含在OutputStreamWriter中,而不是这样做,因为它提供了一种通过其构造函数配置编码的方法。您使用了类似的方法来编写word对象。

Ex:



    File newfile = new File ("kanji.rtf");
    FileOutputStream ofs = new FileOutputStream(newfile);
    OutputStreamWriter print = new OutputStreamWriter(ofs,YOURCHARSET);

阅读kanji.rtf文件时,请执行与InputStreamScanner类相反的操作,并使用您用于编写文件的相同字符集。