작은 유틸리티 스 니펫에 대한 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]
--->абвгд эюя<----
--->абвгд �ю�<----
그래서 내 질문은 : 정확히 여기서 뭐 일이야? 이 스 니펫이 모든 종류의 "유니 코드"입력에 적용되도록하기 위해 필요한 코드 변경 사항은 무엇입니까? 사전에 긴 숨이 질문 감사합니다 죄송합니다
,
사스케
아, 기본적으로 Windows 명령 행 응용 프로그램을 작성할 때 유니 코드를 읽고 쓰는 기본적인 방법이 없습니까? 그리고 여기에 태양으로부터 UTFEncoder/Decoder 디버깅을하고있었습니다. * 패키지 ... – sasuke
제가 아는 한, 크로스 플랫폼 방식은 없습니다. 거기에 제 3 자 콘솔 라이브러리가 있습니다.이 라이브러리는 모든 플랫폼에서 쓸 공통 인터페이스를 제공하지만 I18N 지원의 수준을 알지 못합니다. – McDowell
감사합니다. 내가 주위에 떠있는 몇 가지 저주 구현 (이 같은 http://slashie.net/libjcsi/) 봐야 할 것 같아요 그리고 그들이 정상적인 방법으로 유니 코드를 처리하기를 바랍니다. 수락 됨! – sasuke