Java, UTF-8 및 Windows 콘솔
문제
우리는 Windows에서 Java와 UTF-8을 사용하려고 합니다.애플리케이션은 콘솔에 로그를 작성하며 애플리케이션에 국제화된 로그가 있으므로 로그에 UTF-8을 사용하려고 합니다.
다음을 사용하여 UTF-8을 생성하도록 JVM을 구성할 수 있습니다. -Dfile.encoding=UTF-8
JVM에 대한 인수로.정상적으로 작동하지만 Windows 콘솔의 출력이 깨졌습니다.
그런 다음 콘솔의 코드 페이지를 65001(chcp 65001
) 그러나 이 경우에는 .bat
파일이 작동하지 않습니다.이는 스크립트(start.bat라는 이름)를 통해 애플리케이션을 시작하려고 하면 아무 일도 일어나지 않는다는 것을 의미합니다.간단한 명령은 다음을 반환합니다.
C:\Application> chcp 65001
Activated code page: 65001
C:\Application> start.bat
C:\Application>
하지만 없이는 chcp 65001
, 문제가 없으며 응용 프로그램을 시작할 수 있습니다.
그것에 대한 힌트가 있나요?
해결책
노력하다 chcp 65001 && start.bat
다른 팁
Windows의 Java는 기본적으로 유니코드 출력을 지원하지 않습니다.JNA 라이브러리로 Native API를 호출하여 해결 방법을 작성했습니다. 이 메서드는 콘솔에서 유니코드 출력을 위해 WriteConsoleW를 호출합니다.
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.StdCallLibrary;
/** For unicode output on windows platform
* @author Sandy_Yin
*
*/
public class Console {
private static Kernel32 INSTANCE = null;
public interface Kernel32 extends StdCallLibrary {
public Pointer GetStdHandle(int nStdHandle);
public boolean WriteConsoleW(Pointer hConsoleOutput, char[] lpBuffer,
int nNumberOfCharsToWrite,
IntByReference lpNumberOfCharsWritten, Pointer lpReserved);
}
static {
String os = System.getProperty("os.name").toLowerCase();
if (os.startsWith("win")) {
INSTANCE = (Kernel32) Native
.loadLibrary("kernel32", Kernel32.class);
}
}
public static void println(String message) {
boolean successful = false;
if (INSTANCE != null) {
Pointer handle = INSTANCE.GetStdHandle(-11);
char[] buffer = message.toCharArray();
IntByReference lpNumberOfCharsWritten = new IntByReference();
successful = INSTANCE.WriteConsoleW(handle, buffer, buffer.length,
lpNumberOfCharsWritten, null);
if(successful){
System.out.println();
}
}
if (!successful) {
System.out.println(message);
}
}
}
Linux에서도 비슷한 문제가 있었습니다.우리 코드는 ISO-8859-1(대부분 cp-1252 호환)에 있었지만 콘솔은 UTF-8이어서 코드가 컴파일되지 않았습니다.콘솔을 ISO-8859-1로 변경하면 UTF-8 빌드 스크립트가 중단됩니다.우리는 몇 가지 선택 사항을 찾았습니다.
1- 표준 인코딩을 정의하고 이에 고정합니다.그것이 우리의 선택이었습니다.우리는 ISO-8859-1을 모두 유지하고 빌드 스크립트를 수정하기로 결정했습니다.
2- 빌드 스크립트 내에서도 작업을 시작하기 전에 인코딩을 설정합니다.Erickson과 같은 일부 코드는 말했습니다.Linux에서는 다음과 같았습니다.
lang=pt_BR.ISO-8859-1 /usr/local/xxxx
내 일식은 아직도 이렇습니다.둘 다 잘 작동합니다.
Windows는 65001 코드 페이지를 지원하지 않습니다. http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/chcp.mspx?mfr=true
시도해 보셨나요? 파워셸 이전 cmd.exe 대신.