1

私が書いた小さなエコーサーバーに日本語の文字を取り込もうとしています。問題は、System.in から文字を取得すると (スキャナーなどを介してInputStream名前を付けます)、常にゴミとして入ってくることです。私も使ってみました

message = new String(bufferedReader.readLine().getBytes("UTF8");  

バイトを Unicode として取得しようとするためです。

サーバーからメッセージを出力すると、ようこそ (日本語でようこそ) 正常に表示されます。問題は、ユーザー入力を取得するときにのみ存在します。

コンソールは、Eclipse で UTF8 を使用するように設定されています。

System.in からの入力であることを確認するために作成した小さなテスト プログラムを次に示します。

入力と出力は

よ
よ

そして、ここにコードがあります

public class TestUnicode {

public static void main(String[] args) throws IOException
{
    BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in, "UTF8"));
    String message = stdIn.readLine();
    System.out.println(message);
}

}

public class Client {

public static void main(String[] args) throws IOException 
{
    Socket serverSocket = null;

    try
    {
        serverSocket = new Socket("192.168.1.127", 3000); //connect to myself at port 3000
    }
    catch(IOException e)
    {
        System.out.println(e);
        System.exit(1);
    }

    BufferedReader in = null;
    PrintStream out = null;     
    try //create in and out to write and read from echo
    {
        in = new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));
        out = new PrintStream(serverSocket.getOutputStream(), true);
    }
    catch(IOException e)
    {
        serverSocket.close();
        System.out.println(e);
        System.exit(1);
    }

    String message = null;
    message = in.readLine();
    System.out.println(message); //print out the welcome message

    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
    //create a new buffered reader from my input

    try
    {
        while(true)
        {
            message = bufferedReader.readLine();
            out.println(message); //send a line to the server
            if(message.equals("quit"))
            {
                System.out.println(in.readLine());
                break;
            }
            System.out.println(in.readLine()); //get it back and print it               
        }

        System.out.println("Quiting client...");
    }
    catch(IOException e)
    {
        in.close();
        out.close();
        serverSocket.close();
        System.out.println(e);
        System.exit(1);
    }

    in.close();
    out.close();
    serverSocket.close();
}
}
4

3 に答える 3

1

Windowsを使用していると思います。
ここでの問題は、DOS プロンプトが UTF-8 とはまったく異なる文字エンコーディングを使用しているという事実です。日本語だとShift-JISになるので、UTF-8で読もうとしてInputStreamもうまくいきません。

幸いなことに、希望があります。を使用する代わりに、 を使用System.inできます (使用する必要があります) System.console()。有効な文字エンコード変換が行われたConsole クラスのインスタンスを返します。ただし、これを IDE (特に Eclipse) からデバッグしようとすると、コンソールが接続されないため、機能しないことに注意する必要があります。おっとっと。

修正されたコード (動作するはずですが、テストしていません):

public class TestUnicode {

public static void main(String[] args) throws IOException
{
Console console = System.console();
String message = console.readLine();
console.writer().println(message);
}

Consoleメッセージの印刷にも使用する必要があることに注意してください。なんで?文字エンコーディングを両方の方法で変換する必要があるからです。DOS プロンプトは従来のエンコーディングのままであり、それを変更する方法はありません。

于 2013-09-16T07:25:07.847 に答える
-1

このようにクラスを変更しました

public class TestUnicode {

    /**
     * @param args
     */
    public static void main(String[] args) {
        BufferedReader stdIn = null;
        try {
            stdIn = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }
        String message = "";
        try {
            message = stdIn.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            System.out.println(new String(message.getBytes("UTF-8")));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

コンソールで実行すると、目的の出力が得られました。

したがって、あなたの場合、文字エンコーディング部分を BufferedReader と PrintStream に配置することをお勧めします

注: IDE を使用して実行しようとしたところ、'?' が出力されました。その日本語のキャラクターについては、コンソールで実行することをお勧めします。

ここに画像の説明を入力

于 2013-09-16T06:18:06.400 に答える