Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Пропадают символы / 10 сообщений из 10, страница 1 из 1
19.06.2020, 18:58
    #39971051
Gezmo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропадают символы
Доброго времени суток.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
package com.gezmo;
 
import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
 
public class ControlService {
	private static int numberPort = 8189;
	public static void main(String[] args) {
		try {
		ServerSocket serverSocket = new ServerSocket(numberPort);
		while(true) {
			Socket socket = serverSocket.accept();
			new Thread(new MyServer(socket,serverSocket)).start();
		}
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
}
 
class MyServer implements Runnable{
	Socket socket;
	ServerSocket serverSocket;
	
	public MyServer(Socket socket, ServerSocket serverSocket) {
		this.socket = socket;
		this.serverSocket = serverSocket;
	}
	@Override
	public void run() {
		try {
			Scanner scanner = new Scanner(socket.getInputStream());
			PrintWriter writer = new PrintWriter(socket.getOutputStream(),true);
			//PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "866")), true);
			Service service = new Service(writer);
			writer.println("You connect to: " + InetAddress.getLocalHost());
			while(true) {
				String str = "";
				if(scanner.hasNext()) {
					str = scanner.nextLine();
				}
				if(str.equals("exit")) {
					scanner.close();
					socket.close();
					break;
				}
				if(str.equals("list")) {
					service.getService();
				}
				if(str.equals("stop")) {
					
				}
				if(str.equals("run")) {
					
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
package com.gezmo;
 
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class Service {
	PrintWriter writer;
	
	public Service(PrintWriter writer) {
		this.writer = writer;
	}
 
	void getService() {
		try {
			String regexp = "[\\s]{2,}";//pattern regexp
			Pattern pattern = Pattern.compile(regexp);
			Process process = Runtime.getRuntime().exec("sc query type= service state= all");
		    final Scanner reader = new Scanner(process.getInputStream());
		    while(reader.hasNextLine()) {
		    	String str = new String(reader.nextLine().getBytes(),"866");
		    	if(str.matches("^SERVICE_NAME:.*") || str.matches("^DISPLAY_NAME:.*") || str.matches(".*STATE.*")
		    			|| str.matches("^Имя_службы:.*") || str.matches("^Выводимое_имя:.*") || str.matches(".*Состояние.*")) {
		    		Matcher matcher = pattern.matcher(str);
		    		str = matcher.replaceAll(" ");
		    		str = str.trim();
		    		char fchar = str.charAt(0);
		    		int ichar = (int)fchar;
		    		System.out.println(str);
		    		writer.println(str);
		    		writer.println(ichar);
		    	}
		    }
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	void stopService() {
	}
	void runService() {
	}
}



Однако для некоторых элементов

Пропали русские буквы.
Всё запускается локально. Windows 10.
Подскажите пожалуйста, почему так происходит и как это можно исправить?
Спасибо.
...
Рейтинг: 0 / 0
19.06.2020, 20:28
    #39971085
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропадают символы
А если ты в консоли наберешь

Код: java
1.
c:\ chcp



что ответит?
...
Рейтинг: 0 / 0
19.06.2020, 20:34
    #39971086
Gezmo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропадают символы
mayton,
Код: powershell
1.
2.
C:\>chcp
Текущая кодовая страница: 866


В Eclipce выставлены параметры JVM
Код: powershell
1.
-DconsoleEncoding=Cp866 -Dfile.encoding=Cp866
...
Рейтинг: 0 / 0
19.06.2020, 20:47
    #39971088
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропадают символы
Кодировку надо применять непосредственно в том месте где ты получил InputStream.
...
Рейтинг: 0 / 0
19.06.2020, 22:35
    #39971114
Gezmo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропадают символы
mayton,
Правильно ли я Вас понял, что кодировку нужно указать в строке
Код: java
1.
Scanner reader = new Scanner(process.getInputStream(), "CP866");


метода "getService()"?
Я попробовал это сделать, однако это не исправило ситуацию.
Мне так же не понятно, почему в некоторых случаях, русские буквы выводятся, а в некоторых нет, неужели один вывод команды, даёт разные кодировки?
...
Рейтинг: 0 / 0
19.06.2020, 23:46
    #39971137
Gezmo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропадают символы
Попробовал использовать другой клиент (Putty), в нем все символы отобразились правильно.
Получается вопрос к клиенту(проблемный cmd), PrintWriter или Scanner?
...
Рейтинг: 0 / 0
20.06.2020, 10:21
    #39971171
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропадают символы
Я не знаю как работает sc и что это такое.
Попробуй 1251, utf8.

Если не поможет. Заходи в putty.
C помощью sc сделай spool в текстовый файл

Этот файл заведомо должен содержать русскую букву а.

Далее с помощью dump или hexdump надо посмотреть какой шестнадцатеричный код ей соответствует.

Дальше или я или другие мемберы - подскажут.
...
Рейтинг: 0 / 0
21.06.2020, 12:36
    #39971375
Gezmo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропадают символы
Что заметил, если в консоли cmd несколько раз выполнять команду list(получение списка служб) то результат будет разным т.е. русские буквы могут в одном случае быть, а в другом исчезнуть.
Цифры что показаны на скринах, это же коды нулевого символа в строке. Получается перед отправкой клиенту, строка "нормальная" и только на стороне клиента она "портится" только в виде отображения.
Опыт с Putty это показывает.
Есть ли другие способы отправить клиенту информацию?
При изменении кодировки, результат тот же, в некоторых сообщениях русские символы есть, в других случаях может не быть.
При выполнении команды "sc query type= service state= all" в cmd windows без подключения к серверу, русские буквы отображаются полностью корректно.
...
Рейтинг: 0 / 0
21.06.2020, 12:43
    #39971380
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропадают символы
Покопайся в настройках Putty. Насколько я понимаю ssh клиент поддерживает протокол
согласования языковых настроек. Это должно происходить прозрачно во время коннекта.

Здесь я на 100% не уверен но почитай.

https://tools.ietf.org/html/rfc4253
https://tools.ietf.org/html/rfc3066
...
Рейтинг: 0 / 0
21.06.2020, 13:00
    #39971384
Gezmo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропадают символы
Дали совет сделать задержку в цикле метода getService().
Сделал Thread.sleep(2).
Русские символы сразу появились.

Спасибо за помощь.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Пропадают символы / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]