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-8InputStream将其读出是行不通的。

幸运的是,还有希望。而不是使用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 回答
-1

创建 InputStreamReader 时,应指定要使用的字符集:

new InputStreamReader(System.in, "UTF-8")

这也适用于您的套接字流。

如果您不这样做,则将使用默认字符集(编码)。您还可以通过添加-Dfile.encoding=UTF-8为 VM 参数来更改默认值。

关于您的测试程序,System.out.println 也使用默认字符集,因此即使读取正确,它也会弄乱您的字符串。因此,除非您更改默认字符集,否则您可以使用类似这样的方式打印出字符串:

final OutputStreamWriter w = new OutputStreamWriter(System.out, "UTF-8");
w.write(message);
w.flush();
于 2013-09-16T04:33:55.167 回答