Java Клиент / Сервер не возвращает строку UTF-8 - PullRequest
0 голосов
/ 09 марта 2020

Я пытался передать строку UTF-8 через Java сокет.

Строка содержит смесь английского языка sh и греческого языка.

Моя проблема в том, что когда сообщение проходит через сокет, все греческие символы превращаются в «?».

Я уже пытался установить для набора символов InputStream значение UTF-8.

Ниже приведена попытка, любая помощь будет оценена .

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class Main {
    public static void main(String[] args) {
        try {
            String msg = "This is a test - Αυτο ειναι μια δοκιμη";
            ServerSocket serverSocket = new ServerSocket(9999);

            Thread host = new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true) {
                        try {
                            Socket socket = serverSocket.accept();

                            if (socket != null) {
                                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8));

                                while (true) {
                                    String line = bufferedReader.readLine();

                                    if (line != null) {
                                        System.out.println(line);
                                    } else if(bufferedReader.read() < 0) {
                                        break;
                                    }
                                }
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });

            host.start();

            Socket socket = new Socket("127.0.0.1", 9999);
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
            printWriter.println(msg);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Редактировать 1

Я запускаю и строю свой код с помощью IntelliJ Idea, и именно здесь я нашел проблему.

Но после @Ihar Sadounikau комментарий Я обновил и мой JDK и попытался собрать и запустить через PowerShell, но проблема все еще сохраняется.

И это мой результат

& 'C: \ Программные файлы \ Java \ jdk-13.0.2 \ bin \ java .exe 'Main
Это тест - ?? τ? ε ?? α? ?? α δ ?????

Ответы [ 2 ]

3 голосов
/ 09 марта 2020

С помощью этой строки: PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true); вы конвертируете поток байтов (т. Е. InputStream / OutputStream в поток символов (т. Е. Reader / Writer). Каждый раз, когда вы делаете это, если вам не удается указать кодирование, вы получаете платформу по умолчанию, что маловероятно, что вы хотите.

Вы (и @IharSadounikau) видите разные результаты, потому что «платформа по умолчанию» переключается на вас. Это одна из причин, по которой вы ДЕЙСТВИТЕЛЬНО не хочу его использовать, когда-либо. Выяснить, что в вашем коде есть ошибка, в которой он работает, только если кодировка вашей платформы по умолчанию такая же, как и у человека, который ее разработал - обычно непроверенный .

Попробуйте new PrintWriter(socket.getOutputStream(), true, StandardCharsets.UTF_8).

0 голосов
/ 09 марта 2020

Может быть, это поможет:

String msgEncode = URLEncoder.encode(msg, "UTF-8");
printWriter.println(msgEncode);

И:

String line = bufferedReader.readLine();
String msgDecode = URLDecoder.decode(line, "UTF-8");
...