Использование японского ввода java

Я пытаюсь сохранить японские слова в виде строк, но каждый раз, когда я пытаюсь сохранить строки, я получаю вопросительные знаки там, где должны быть символы.

например, если пользователь вводит: こんにちは

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

Он отобразит пять вопросительных знаков там, где должны отображаться пять символов. Если я объявлю японское слово строкой, я смогу отобразить это слово.

ex.

 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();
    }
}

Когда я открываю файл, в который я написал кандзи, он делает то же самое, отображая кучу вопросительных знаков. Количество вопросительных знаков складывается с количеством символов, но они просто не будут отображаться, если я использую сканер или любой другой метод для получения текста от пользователя.


person Taikun    schedule 04.06.2013    source источник
comment
это проблема с отображением вашей оболочки в первом случае .... он может не поддерживать все символы ... с вашей стороны нет серьезных проблем   -  person pinkpanther    schedule 05.06.2013
comment
@pinkpanther: я сомневаюсь, что его первый println(string) напечатает правильный ответ ;) Там не так. Это должно быть println (строка)   -  person Burkhard    schedule 05.06.2013
comment
@Burkhard, я говорю о его контексте, а не о println   -  person pinkpanther    schedule 05.06.2013
comment
измените кодировку символов вашей IDE, которая по умолчанию установлена ​​в настройках ОС..... измените ее   -  person pinkpanther    schedule 05.06.2013
comment
На ваш вопрос есть ответ [stackoverflow.com/questions/15488628/   -  person pinkpanther    schedule 05.06.2013


Ответы (1)


Что ж, для печати в стандартном выводе измените настройку кодировки netbeans или явно создайте поток UTF-8.

Часть 1:

Первая часть взята из ответа здесь

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 сделайте то же самое в обратном порядке с классом InputStream или Scanner и используйте ту же кодировку, которую вы использовали для записи файла.

person pinkpanther    schedule 04.06.2013
comment
У меня по-прежнему возникают проблемы при отображении кандзи, которые были переданы через сканер. - person Taikun; 05.06.2013
comment
см. мое редактирование на сканере ... это решило проблему? если это все еще не устранило проблему, рассмотрите возможность редактирования вашего вопроса с полным кодом и входными данными :) - person pinkpanther; 05.06.2013
comment
Я все еще получаю проблему; Я добавил остальную часть своего кода к вопросу. Спасибо за помощь, кстати. - person Taikun; 05.06.2013
comment
@Taikun при вводе японского текста вы получаете вопросительные знаки? - person pinkpanther; 05.06.2013