UTF-8을 사용할 때에도 Windows 대 Linux에서 ¿가 다른 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/176196

  •  05-07-2019
  •  | 
  •  

문제

Linux 대 Windows에서 다음이 다른 이유는 무엇입니까?

System.out.println(new String("¿".getBytes("UTF-8"), "UTF-8"));

Windows에서 :

¿

Linux에서 :

¿

도움이 되었습니까?

해결책

System.out.println ()은 시스템 기본 인코딩에서 텍스트를 출력하지만 콘솔은 자체 인코딩 (또는 "CodePage") 설정에 따라 해당 출력을 해석합니다. Windows 시스템에서 두 인코딩이 일치하는 것처럼 보이지만 Linux 상자에는 출력이 UTF-8에있는 반면 콘솔은 ISO-8859-1과 같은 단일 바이트 인코딩으로 디코딩하는 것입니다. 또는 Jon이 제안한 것처럼 소스 파일은 UTF-8으로 저장되고 있습니다. javac 유니 코드 이스케이프를 사용하여 피할 수있는 문제인 다른 것으로 읽고 있습니다.

ASCII 텍스트 이외의 것을 출력 해야하는 경우 가장 좋은 방법은 적절한 인코딩을 사용하여 파일에 쓰는 것인 다음 텍스트 편집기를 사용하여 파일을 읽는 것입니다. 그건 그렇고,이 코드는 다음과 같습니다.

new String("¿".getBytes("UTF-8"), "UTF-8")

... 출력에 영향을 미치지 않습니다. 모든 일은 문자열의 내용을 바이트 배열로 인코딩하고 다시 해독하여 원래 문자열을 재현하여 비싼 No-OP입니다. 특정 인코딩에서 텍스트를 출력하려면 outputStreamWriter를 사용해야합니다.

FileOutputStream fos = new FileOutputStream("out.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");

다른 팁

문제가 정확히 어디에 있는지 확실하지 않지만 주목할 가치가 있습니다.

¿ (0xc2,0xbf)

UTF-8으로 인코딩 한 결과입니다

0xBF,

¿에 대한 유니 코드 코드 포인트

따라서 Linux 케이스에서는 출력이 UTF-8으로 표시되지 않고 단일 바이트 문자열로 표시됩니다.

Linux 터미널의 인코딩이 무엇인지 확인하십시오.

우분투의 그놈 말단의 경우 - "터미널"메뉴로 이동하여 "문자 인코딩 설정"을 선택하십시오.

Putty, 구성 -> 창 -> 번역 -> UTF -8의 경우 (그리고 그것이 작동하지 않으면 참조하십시오. 이 게시물).

이 코드를 실행하여 컴파일러 또는 콘솔 문제인지 확인하십시오.

public static void main(String[] args) throws Exception {
    String s = "¿";
    printHex(Charset.defaultCharset(), s);

    Charset utf8 = Charset.forName("UTF-8");
    printHex(utf8, s);
}

public static void printHex(Charset encoding, String s)
        throws UnsupportedEncodingException {
    System.out.print(encoding + "\t" + s + "\t");

    byte[] barr = s.getBytes(encoding);
    for (int i = 0; i < barr.length; i++) {
        int n = barr[i] & 0xFF;
        String hex = Integer.toHexString(n);
        if (hex.length() == 1) {
            System.out.print('0');
        }
        System.out.print(hex);
    }
    System.out.println();
}

UTF-8에 대한 인코딩 된 바이트가 각 플랫폼마다 다른 경우 ( C2BF), 컴파일러 문제입니다.

컴파일러 문제 인 경우 "¿"를 대체하십시오. " u00bf".

편집기 및 컴파일러 인코딩으로 인해 소스 코드가 포함 된 바이트 또는 GetBytes ()가 호출되는 문자열을 정확히 알기가 어렵습니다.

여전히 문제를 보여주는 ASCII (및 관련 uxxxx에 빠져 나가는 uxxxx 스케이프) 만 포함 된 짧지 만 완전한 프로그램을 생성 할 수 있습니까?

문제는 Windows 또는 Linux의 콘솔 출력에 문제가있을 수 있지만 먼저 재현 가능한 프로그램을 얻는 것이 좋습니다.

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