실제로 tasklist
이 사용하는 charset은 이며 항상 시스템 기본값과 다른입니다.
한편 출력이 ASCII으로 제한되는 한 기본값을 사용하는 것이 안전합니다. 일반적으로 실행 모듈은 이름에 ASCII 문자 만 있습니다.
올바른 문자열을 얻으려면 (ANSI) Windows 코드 페이지를 OEM 코드 페이지로 변환하고 후자를 InputStreamReader
으로 charset으로 전달해야합니다.
이러한 인코딩 간에는 포괄적 인 매핑이없는 것으로 보입니다. 다음 매핑을 사용할 수 있습니다 :
Map<String, String> ansi2oem = new HashMap<String, String>();
ansi2oem.put("windows-1250", "IBM852");
ansi2oem.put("windows-1251", "IBM866");
ansi2oem.put("windows-1252", "IBM850");
ansi2oem.put("windows-1253", "IBM869");
Charset charset = Charset.defaultCharset();
String streamCharset = ansi2oem.get(charset.name());
if (streamCharset) {
streamCharset = charset.name();
}
InputStreamReader isr = new InputStreamReader(p.getInputStream(),
streamCharset);
이 방법 windows-1251
및 IBM866
쌍 날 위해 일했습니다.
Windows에서 사용되는 현재 OEM 인코딩을 얻으려면 GetOEMCP
기능을 사용할 수 있습니다.반환 값은 에 의존합니다. 유니 코드가 아닌 프로그램에 대한 언어 탭 지역 및 언어 제어판에 설정합니다. 변경 사항을 적용하려면 재부팅해야합니다. ANSI 및 OEM :
Windows에서 인코딩 두 가지 종류가 있습니다.
전자는 GUI 모드에서 실행되는 비 유니 코드 응용 프로그램에서 사용됩니다.
후자는 콘솔 응용 프로그램에서 사용됩니다. 콘솔 응용 프로그램은 현재 OEM 인코딩으로 표현할 수없는 문자를 표시 할 수 없습니다.
tasklist
은 콘솔 모드 응용 프로그램이므로 출력은 항상 현재 OEM 인코딩입니다.
영어 시스템의 경우 일반적으로 Windows-1252 및 CP850입니다.
러시아에 거주하고있는 시스템의 인코딩은 Windows-1251이고 CP866입니다. 내가 파일에 tasklist
의 출력을 캡처하는 경우
는 파일이 제대로 키릴 문자를 표시 할 수 없습니다 : (안녕)
내가 메모장에서 볼 대신 Привет
의 ЏаЁўҐв
얻을.
µTorrent
은 зTorrent
으로 표시됩니다.
tasklist
에서 사용하는 인코딩을 변경할 수 없습니다.
그러나 출력 인코딩을 cmd
으로 변경할 수 있습니다. /u
스위치를 넘겨 주면 모든 것이 UTF-16 인코딩으로 출력됩니다. Hi
두 바이트와 새 라인 (\r
와 \n
) 두 바이트 :
는
cmd /c echo Hi>echo.txt
echo.txt
의 크기는 4 바이트이다.
cmd /u /c echo Hi>echo.txt
지금 echo.txt
의 크기는 8 바이트입니다 : 각 문자는 두 바이트로 표현된다.
여기에 질문이 있습니까? 해보고 보셨습니까? –
@JimGarrison InputStreamReader의 * "default encoding"의존성에 대한 FindBugs로부터 경고를 받았는데 이것이 문제를 일으킬 수 있는지 없는지 전혀 알지 못합니다. 그래서 나는 그것을 수색했다고 말할 수있는 두 번째 게시물을 찾았습니다. 그게 내가 확인하고 싶은거야. 내 컴퓨터에서 그 코드가 잘 작동합니다. – assylias
불확실성이 상당히 크기 때문에 질문이 아닌 의견으로 추가하겠습니다. 즉, 그 같은 시스템 유틸리티가 사용하는 문자 집합은 OS 설치를위한 기본 로켈의 문자 집합이라고 생각합니다. 해당 로케일을 쿼리하고이를 사용하여 출력 스트림을 해석하는 것이 가장 일반적인 접근 방법 인 것 같습니다. 그러나 현지화가있는 경우이를 해석 할 수 있도록 변경할 수있는 필드를 리버스 엔지니어링해야합니다. 그리고 이것은 문제의 유틸리티가 처음부터 이러한 방식으로 다양하게 작성되었는지 여부에 따라 달라집니다. – eh9