Я реализую часть программного обеспечения, которая работает следующим образом:
У меня есть сервер Linux, на котором запущено приложение терминала vt100, которое выводит текст.
Моя программа соединяется с сервером по сети и считывает / анализирует биты текста в соответствующих данных.
Соответствующие данные отправляются небольшому клиенту, запущенному веб-сервером, который выводит данные на HTML-страницу.
Моя проблема в том, что определенные специальные символы, такие как "åäö", выводятся в виде вопросительных знаков (классика).
Справочная информация:
Моя программа читает поток байтов, используя Apache Commons TelnetClient . Поток байтов преобразуется в строку, затем соответствующие биты подстрокуются и возвращаются вместе с символами-разделителями. После этого новая строка преобразуется обратно в байтовый массив и отправляется с помощью сокета клиенту, запущенному веб-сервером. Этот клиент создает строку из полученных байтов и выводит ее на стандартный вывод, который веб-сервер считывает и выводит HTML.
Шаг 1:
byte [] -> String -> byte [] -> [отправить клиенту]
Шаг2:
byte [] -> String -> [print output]
Проблема:
Когда я запускаю свою программу на Java в Windows, все символы, включая «åäö», правильно выводятся на итоговую HTML-страницу. Однако, если я запускаю программу в Linux , все специальные символы преобразуются в "? " (вопросительный знак).
Веб-сервер и клиент в настоящее время работают в Windows (шаг 2).
Код:
Программа в основном работает так:
Моя программа:
byte[] data = telnetClient.readData() // Assume method works and returns a byte[] array of text.
// I have my reasons to append the characters one at a time using a StringBuffer.
StringBuffer buf = new StringBuffer();
for (byte b : data) {
buf.append((char) (b & 0xFF));
}
String text = buf.toString();
// ...
// Relevant bits are substring'ed and put back into the String.
// ...
ServerSocket serverSocket = new ServerSocket(...);
Socket socket = serverSocket.accept();
serverSocket.close();
socket.getOutputStream.write(text.getBytes());
socket.getOutputStream.flush();
Клиент, запущенный веб-сервером:
Socket socket = new Socket(...);
byte[] data = readData(socket); // Assume this reads the bytes correctly.
String output = new String(data);
System.out.println(output);
Предположим, синхронизация между чтением и записью работает.
Мысли:
Я пробовал с различными способами кодирования и декодирования байтового массива без результатов. Я немного новичок в вопросах кодирования кодировки и хотел бы получить несколько советов. Кодировка по умолчанию в Windows «WINDOWS 1252», по-видимому, пропускает специальные символы через весь сервер к веб-серверу, но при запуске на компьютере с Linux кодировка по умолчанию отличается. Я попытался запустить Charset.defaultCharset (). ForName (), и он показывает, что мой компьютер с Linux установлен на «US-ASCII». Я думал, что Linux по умолчанию "UTF-8"?
Как мне сделать, чтобы моя программа работала в Linux?