Java でソケット通信で文字化けが発生した際の対処法
Javaでソケット通信の文字化けを解決するには、次の方法を利用できます。
- InputStreamReaderやOutputStreamWriterを用いて文字ストリームを扱うことで、文字コードを指定できます。データをやり取りする際に、指定した文字コードでエンコードやデコードを行います。
Socket socket = new Socket("localhost", 8080);
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");
outputStreamWriter.write("你好");
outputStreamWriter.flush();
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
char[] buffer = new char[1024];
int length = inputStreamReader.read(buffer);
System.out.println(new String(buffer, 0, length));
- データの送受信にはgetBytes()メソッドと指定した文字コードでのエンコードとデコードを利用します。
Socket socket = new Socket("localhost", 8080);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("你好".getBytes("UTF-8"));
outputStream.flush();
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int length = inputStream.read(buffer);
System.out.println(new String(buffer, 0, length, "UTF-8"));
- サーバサイドで文字コード方式を設定する。
ServerSocket serverSocket = new ServerSocket(8080);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
char[] buffer = new char[1024];
int length = inputStreamReader.read(buffer);
System.out.println(new String(buffer, 0, length));
なお、送受信するデータの文字コードが合致していることを確認してください。一般的な文字コードにはUTF-8とGBKがあります。