문제

우리는 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 대신.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top