편집 :이 질문은 다소 비관적입니다. 응답 한 사람들에게 감사드립니다. 좀 더 구체적 인 후속 질문을 게시 할 수 있습니다.Java 1.6 Windows-1252 인코딩이 3 자로 실패합니다.
오늘은 어떤 인코딩 문제를 투자하고 기본 생식 경우 분리하기 위해 단위 테스트를 썼다 :
int badCount = 0;
for (int i = 1; i < 255; i++) {
String str = "Hi " + new String(new char[] { (char) i });
String toLatin1 = new String(str.getBytes("UTF-8"), "latin1");
assertEquals(str, new String(toLatin1.getBytes("latin1"), "UTF-8"));
String toWin1252 = new String(str.getBytes("UTF-8"), "Windows-1252");
String fromWin1252 = new String(toWin1252.getBytes("Windows-1252"), "UTF-8");
if (!str.equals(fromWin1252)) {
System.out.println("Can't encode: " + i + " - " + str +
" - encodes as: " + fromWin1252);
badCount++;
}
}
System.out.println("Bad count: " + badCount);
출력 :
Can't encode: 129 - Hi ? - encodes as: Hi ?? Can't encode: 141 - Hi ? - encodes as: Hi ?? Can't encode: 143 - Hi ? - encodes as: Hi ?? Can't encode: 144 - Hi ? - encodes as: Hi ?? Can't encode: 157 - Hi ? - encodes as: Hi ?? Can't encode: 193 - Hi Á - encodes as: Hi ?? Can't encode: 205 - Hi Í - encodes as: Hi ?? Can't encode: 207 - Hi Ï - encodes as: Hi ?? Can't encode: 208 - Hi ? - encodes as: Hi ?? Can't encode: 221 - Hi ? - encodes as: Hi ?? Bad count: 10
JDK 1.6.0_07 맥 OS 10.6에 있습니다. 2
내 관찰 :
Latin1 대칭 모든 254자를 암호화합니다. Windows-1252는 그렇지 않습니다. 세 개의 인쇄 가능한 문자 (193, 205, 207)는 Latin1과 Windows-1252의 동일한 코드이므로 어떤 문제도 기대하지 않습니다.
누구든지이 동작을 설명 할 수 있습니까? 이것은 JDK 버그입니까?
- 그것은 아무 의미 론적 의미를 문자열 사이에 효과적으로 쓸모 변환을 만들기 때문에 제임스
제 생각에는
게시 한 코드가 의미가 없습니다 (문자열에서 UTF-8 인코딩 된 데이터를 가져 와서 그것을 마치 * latin1 *처럼 해석). 그러므로 당신이하려고하는 것을 따라하기가 꽤 어렵습니다. –
Windows-1252로 변환해야하는 UTF-8로 인코딩 된 일부 데이터가 있습니다. 필자의 프로덕션 시스템에서는 이것이 문자 193에서 실패했음을 알게되었으므로이 기본 복제 사례를 작성했으며 놀랍게도이 10 개의 문자가 Windows-1252와 UTF-8을 대칭으로 인코딩하지 않는다는 사실을 발견했습니다. 모든 254자를 UTF-8과 Latin1 사이에서 인코딩 할 수 있습니다. 그러므로 나의 놀람과 혼란. 그게 도움이 되니? –
정확히 ** ** "코드 변환"이란 것을 의미합니까? 동일한 글리프를 나타내는 Windows-1252 인코딩 된 바이트를 원합니까? 그렇다면 UTF-8이 모든 유니 코드 문자를 나타낼 수 있기 때문에 모든 경우에서 이것이 가능하지 않다는 것을 알아야합니다. Windows-1252는 분명히 할 수 없습니다. –