2017-01-04 1 views
0

저는 스캐너를 통해 콘솔에 Ø와 같은 문자를 입력 할 때 숫자 값을 얻기 위해 왜 65533 (부호없는 짧은 값의 최대 값)으로 끝나는 지 알아내는 데 몇 시간 씩 노력했습니다.65533을 (à, Ø, æ, æ 등) 문자의 char 값으로받습니다!

라틴 문자의 경우는 그렇지 않습니다. 왜 그런가? = Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD)

public static void main(String[] args) { 

    Scanner sc = new Scanner(System.in); 
    char[] chars = sc.next().toCharArray(); 

    for(int i = 0; i < chars.length; i++){ 

     System.out.println((int)chars[i]); 
    } 
} 
+2

아마도 코드 일부를 게시해야합니다. – Vampire

+0

정말 간단하고 간단한 코드예요! 나는 코드를 추가했다. – phadam

답변

2

65533 당신의 캐릭터가 사용하는 문자 인코딩 내에서 올바르게 해석되지 않는 즉, 그래서 대체 값으로 대체되고있다.

+0

어떻게 고칠 수 있습니까? – phadam

+0

@ Vampire 님의 덧글에 따라 시작하고 코드를 게시하십시오. 문제를 재현 할 수 있습니다. – Alohci

1

인코딩 문제가 있습니다.
System.in을 통해 들어오는 바이트는 Scanner이 해당 바이트를 문자로 변환하는 데 사용하는 인코딩에 포함되어 있지 않습니다.
System.inCp1252 (Windows 기본 인코딩)이지만 스캐너 사용자 인 UTF-8은 바이트를 디코딩해야합니다.
바이트 시퀀스는 유효한 UTF-8 문자가 아니므로 대체 문자가 대신 사용됩니다.

Scanner sc = new Scanner(System.in, System.getProperty("file.encoding"));을 수행하면 코드가 모든 곳에서 올바르게 작동해야합니다.

+0

불행히도! 나는 base64로 문자열을 인코딩하고 거기에서 내 작업을 수행 할 생각이다. – phadam

+0

어떻게 도움이 될지 모르지만 문제가 해결되면 계속 진행하십시오. 그러나 만약 base64 문자열을 몇몇 문자로 다시 변환하고 싶다면 여전히'System.in'을 위해'file.encoding'의 내용이어야하는 바이트의 인코딩을 알아야합니다. – Vampire

+0

그러나이 스캐너는 작동했습니다.'Scanner sc = new Scanner (System.in, "Cp1252"); – phadam

관련 문제