2012-02-16 3 views
17

일부 레거시 코드는 번역을 위해 플랫폼의 기본 문자 집합을 사용합니다. "서방 세계"에 설치된 Windows 및 Linux의 경우 그 의미를 알고 있습니다. 그러나 러시아어 또는 아시아 언어 플랫폼에 대해 생각해 보면 플랫폼의 기본 문자 집합 (UTF-16)이 무엇인지 전혀 알 수 없습니다.Java : 다른 플랫폼에서 플랫폼의 기본 charset입니까?

따라서 다음 코드 줄을 실행할 때 내가 얻을 것이 무엇인지 알고 싶습니다 :

System.out.println("Default Charset=" + Charset.defaultCharset()); 

편집 : 내가 캐릭터 세트의 문제가 여기에 유니 코드로 자신의 차이를 논의하고 싶지 않아 . 나는 단지 어떤 운영체제가 어떤 특정 문자 집합을 생성 하는지를 모으기를 원한다. 구체적인 가치 만 게시하십시오!

답변

21

사용자 별 설정입니다. 현대의 많은 Linux 시스템에서 UTF-8입니다. Mac에서는 MacRoman입니다. Windows의 미국에서는 CP1250, 유럽에서는 CP1252입니다. 중국에서는 간체 중국어 (Big5 또는 GB *)를 자주 볼 수 있습니다.

하지만 각 사용자가 언제든지 변경할 수있는 시스템 기본값입니다. 아마도 해결책은 다음과 같습니다. 시스템 속성 file.encoding

See this answer을 사용하여 앱을 시작할 때 인코딩을 설정합니다. 이 스크립트를 앱을 시작하는 작은 스크립트에 넣어 사용자 기본이 오염되지 않도록하는 것이 좋습니다.

+0

사실, 시스템의 기본 문자 집합은 사용자가 변경할 수 있지만 개발자가 아닌 개발자는 몇 명입니까? – Robert

+1

회사 네트워크에있는 글로벌 로그인 사용자는 어떻습니까? 내가 말하는 것은 : 거기에 어떤 유용한 가치도 기대하지 마십시오. 코드에서 항상 데이터 인코딩을 지정해야합니다.그것이 작동하지 않으면'file.encoding' 또는 일을 설정해야합니다 ** ** ** break :-) –

+1

@Aaron Digulla : 사용자가 데이터를 제공하고 인코딩 메타 데이터없이 제공되는 경우 플랫폼 기본값 인코딩이 실제로 가장 좋은 방법 일 수 있습니다. –

6

"서양 세계"의 Windows 및 Linux 설치의 경우 그 의미를 알고 있습니다.

아마 당신도 그렇게 생각하지 않을 것입니다.

그러나 러시아어 또는 아시아 플랫폼에 대해 생각 나는 그들의 플랫폼의 디폴트의 캐릭터 세트는

보통은 역사적으로 자신의 국가에서 사용되는 어떤 인코딩의 무엇인지 완전히 확신입니다.

(단지 UTF-16?).

가장 확실하게 아닙니다. 컴퓨터 사용은 유니 코드 표준이 존재하기 전에 널리 퍼지고 각 언어 영역은 언어를 지원할 수있는 하나 이상의 인코딩을 개발했습니다. ASCII 외부에서 128 자 미만이 필요한 사람들은 일반적으로 "확장 ASCII"를 개발했으며 그 중 많은 수가 결국 ISO-8859으로 표준화되었지만 다른 사람은 2 바이트 인코딩을 개발했습니다. 예를 들어, 일본의 경우 전자 메일은 일반적으로 JIS을 사용하지만 웹 페이지는 Shift-JIS을 사용하고 일부 응용 프로그램은 EUC-JP을 사용합니다. 이들 중 하나가 Java에서 플랫폼 기본 인코딩으로 발생할 수 있습니다.

이것은 모두 엄청난 혼란입니다. 바로 이것이 유니 코드가 개발 된 이유입니다. 그러나 엉망은 아직 사라지지 않았으며 우리는 여전히 그것을 다루어야하고 주어진 바이트 묶음을 텍스트로 해석하도록 인코딩하는 것에 대해 어떤 가정도하지 말아야합니다. There Ain't No Such Thing as Plain Text.

+0

마이클, 당신은 너무 우월해서 눈물을 흘립니다. 그것은 '표준 인코딩'을 금지하기 위해 표준 라이브러리에 원숭이 패치를 적용하는 것을 고려한 재앙입니다. 나는이 문제로 인해 고정 될 수 없게 절단 된 테라 바이트 코퍼라를 가지고있다. 자바 자체가 아닌 여기에있는 문제는 부당한 자바 기본값입니다. 확실히 대처할 수 있습니다. 나는 시스템을 어떻게 고쳐야할지 모르겠다. 왜냐하면 시간의 시작부터 끝까지 버그와 호환되는 것은 Java의 * modus operandi * 인 것 같다. 디자인 결함을 수정하는 방법을 모르겠습니다. – tchrist

+0

문제는 "어떤 가정도하지 못합니다"입니다. 사용자 *는 인코딩 표시가없는 일반 텍스트 파일을 작성합니다. 레거시 시스템 *은 알 수없는 인코딩으로 문자열을 저장합니다 *. – plugwash