2011-12-29 4 views
4

작은 유틸리티 스 니펫에 대한 Java 응용 프로그램에서 "유니 코드 사용자 입력"을 검색하려고했습니다. 문제는 Ubuntu에서 UTF-8로 OS 넓은 인코딩을 추측하고 있지만 "cmd"에서 실행할 때 Windows에서 작동하지 않는 "out of the box"에서 작동하는 것 같습니다. 우분투에Java의 콘솔 응용 프로그램에서 유니 코드 입력

public class SerTest { 

    public static void main(String[] args) throws Exception { 
     testUnicode(); 
    } 

    public static void testUnicode() throws Exception { 
     System.out.println("Default charset: " + 
      Charset.defaultCharset().name()); 
     BufferedReader in = 
      new BufferedReader(new InputStreamReader(System.in, "UTF-8")); 
     System.out.printf("Enter 'абвгд эюя': "); 
     String line = in.readLine(); 
     String s = "абвгд эюя"; 
     byte[] sBytes = s.getBytes(); 
     System.out.println("strg bytes: " + Arrays.toString(sBytes)); 
     byte[] lineBytes = line.getBytes(); 
     System.out.println("line bytes: " + Arrays.toString(lineBytes)); 
     PrintStream out = new PrintStream(System.out, true, "UTF-8"); 
     out.print("--->" + s + "<----\n"); 
     out.print("--->" + line + "<----\n"); 
    } 

} 

출력 (구성을 변경하지 않고) : 다음과 같이 고려의 코드는 윈도우에

[email protected]> javac SerTest.java && java SerTest 
Default charset: UTF-8 
Enter 'абвгд эюя': абвгд эюя 
strg bytes: [-48, -80, -48, -79, -48, -78, -48, -77, -48, -76, 32, -47, -115, -47, -114, -47, -113] 
line bytes: [-48, -80, -48, -79, -48, -78, -48, -77, -48, -76, 32, -47, -115, -47, -114, -47, -113] 
--->абвгд эюя<---- 
--->абвгд эюя<---- 

출력 (JAVA_TOOL_OPTIONS에 의해 영향을 어떠한 방식으로) 프롬프트 명령 : 이클립스 콘솔에서

E:\>chcp 65001 
Active code page: 65001 

E:\>java -Dfile.encoding=utf8 SerTest 
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=utf8 
Default charset: UTF-8 
Enter 'абвгд эюя': юя': ': абвгд эюя 
strg bytes: [-48, -80, -48, -79, -48, -78, -48, -77, -48, -76, 32, -47, -115, -47, -114, -47, -113] 
Exception in thread "main" java.lang.NullPointerException 
     at SerTest.testUnicode(SerTest.java:26) # byte[] lineBytes = line.getBytes(); 
     at SerTest.main(SerTest.java:15) 

출력 (저기서 후 g JAVA_TOOL_OPTIONS) : 내가 피하려는 가능하면 시스템 전체 환경 변수 (JAVA_TOOL_OPTIONS)를 추가 한 때문에 이클립스 콘솔에서

Default charset: UTF-8 
Enter 'абвгд эюя': абвгд эюя 
strg bytes: [-48, -80, -48, -79, -48, -78, -48, -77, -48, -76, 32, -47, -115, -47, -114, -47, -113] 
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=utf8 
line bytes: [-48, -80, -48, -79, -48, -78, -48, -77, -48, -76, 32, -47, -115, -47, -114, -47, -113] 
--->абвгд эюя<---- 
--->абвгд эюя<---- 

, 그것은 노력하고 있습니다. 이클립스 콘솔에서

출력 ( JAVA_TOOL_OPTIONS 제거가) :

Default charset: UTF-8 
Enter 'абвгд эюя': абвгд эюя 
strg bytes: [-48, -80, -48, -79, -48, -78, -48, -77, -48, -76, 32, -47, -115, -47, -114, -47, -113] 
line bytes: [-61, -112, -62, -80, -61, -112, -62, -79, -61, -112, -62, -78, -61, -112, -62, -77, -61, -112, -62, -76, 32, -61, -111, -17, -65, -67, -61, -111, -59, -67, -61, -111, -17, -65, -67] 
--->абвгд эюя<---- 
--->абвгд �ю�<---- 

그래서 내 질문은 : 정확히 여기서 뭐 일이야? 이 스 니펫이 모든 종류의 "유니 코드"입력에 적용되도록하기 위해 필요한 코드 변경 사항은 무엇입니까? 사전에 긴 숨이 질문 감사합니다 죄송합니다

,
사스케

답변

3

일부 노트 :

  • -Dfile.encoding=utf8not supported하고 의도하지 않은 부작용이 발생할 수 있습니다 :

은 "하여 file.encoding"속성은 J2SE 플랫폼 사양으로 필요하지 않습니다; Sun의 구현에 대한 내부적 인 내용이므로 사용자 코드로 검사하거나 수정해서는 안됩니다. 읽기 전용이기도합니다. 이 속성의 설정을 명령 줄에서 또는 프로그램 실행 중에 다른 임의의 값으로 지원하는 것은 기술적으로 불가능합니다.

  • Console 클래스는 감지하고 터미널 인코딩을 사용하지만 65001은 (UTF-8) Windows에서 지원하지 않는 것 - 적어도, 그것이 내가 그것을 시도 마지막 시간을하지 않았다

나는 cmd.exe로 유니 코드를 사용하는 올바른, 문서화 된 방법은 WriteConsoleWReadConsoleW을 사용하는 것이라고 믿습니다. 길을 가야하는 것입니다 그

+1

아, 기본적으로 Windows 명령 행 응용 프로그램을 작성할 때 유니 코드를 읽고 쓰는 기본적인 방법이 없습니까? 그리고 여기에 태양으로부터 UTFEncoder/Decoder 디버깅을하고있었습니다. * 패키지 ... – sasuke

+0

제가 아는 한, 크로스 플랫폼 방식은 없습니다. 거기에 제 3 자 콘솔 라이브러리가 있습니다.이 라이브러리는 모든 플랫폼에서 쓸 공통 인터페이스를 제공하지만 I18N 지원의 수준을 알지 못합니다. – McDowell

+0

감사합니다. 내가 주위에 떠있는 몇 가지 저주 구현 (이 같은 http://slashie.net/libjcsi/) 봐야 할 것 같아요 그리고 그들이 정상적인 방법으로 유니 코드를 처리하기를 바랍니다. 수락 됨! – sasuke

3

NPE는 당신이 lineBytes가 null 것을 의미, Arrays.toString(lineBytes)를 호출하려고 할 때 발생합니다.

lineBytes 값 : line.getBytes()입니다. getBytes()UnsupportedEncodingException이 내부에있는 경우에만 null을 반환 할 수 있습니다.

windows 명령 프롬프트가 유니 코드 을 기본적으로 지원하지 않기 때문에 발생합니다.입니다. 이것은 명령 프롬프트가 완전히 유니 코드 가능하기 때문에 Ubuntu에서 작동합니다. 이클립스의 콘솔 창은 입력을 위해 유니 코드를 지원하고 JAVA_TOOL_OPTIONS를 사용하여 아웃풋을 수행하는 자바 컴포넌트이기 때문에 Eclipse와 부분적으로 작동한다.

결론은 유니 코드 문자를 사용할 수 있도록 windows 명령 프롬프트를 구성하려는 것입니다. 나는이 주제에 대해 여러 토론을 보았다. 이 부분을 살펴보십시오. Unicode characters in Windows command line - how?

이 정보가 도움이되기를 바랍니다.

+0

:

는 나는이보고 된 블로그 게시물의 몇 가지를 썼다. 나는 아무도이 대답에 아무 것도 덧붙일 수 없다고 생각한다. –

+0

답장을 보내 주셔서 감사합니다. 몇 가지 설명 : NPE는'line'에서'getBytes()'를 호출하기 때문에'line'이 NULL이라는 의미입니다. 많은 의미가 없습니다. 'UnsupportedEncodingException'이 throw되지 않았 음을 확인할 수 있습니다 (적어도 나는 그것을 보지 못합니다). 마지막으로, 링크 된 스레드에서 언급 한 제안을 시도했습니다. 동일한 결과입니다. 무슨 일이 벌어 질지도 몰라요? – sasuke

+0

@asasuke, 나는 네가 틀렸다고 생각해. 스택 추적을 참조하십시오 : SerTest.testUnicode (SerTest.java:26) line.getBytes(); at SerTest.main (SerTest.java:15)은 main()과 NPE가 던져지는 점 사이에 11 줄이 있음을 의미합니다. 그리고 이것은 정확히'byte [] lineBytes = line.getBytes();'입니다. – AlexR

관련 문제