문제

Java를 사용하여 ANSI 문자열을 UTF로 변환하는 방법이 있습니까?

DataInputStream 클래스의 readUtf & writeUtf 메소드를 사용하여 스트링을 제거하고 세리어즈 문자열을 사용하는 사용자 정의 직렬 라이저가 있습니다. ANSI에서 인코딩 된 문자열을 받고 너무 길면 ~ 100000 숯이 길다면 오류가 발생합니다.

원인 : java.io.utfdataformatexception : 인코딩 된 문자열이 너무 길다 : 106958 바이트

그러나 Junit 테스트에서는 120000 'A의 문자열을 만들 수 있으며 완벽하게 작동합니다.

다음 게시물을 확인했지만 여전히 오류가 있습니다.

도움이 되었습니까?

해결책

이 오류는 문자 인코딩으로 인해 발생하지 않습니다. 이는 UTF 데이터의 길이가 잘못되었음을 의미합니다.

편집 : 이것은 오류를 읽지 않고 쓰기 오류라는 것을 깨달았습니다.

UTF 길이는 2 바이트에 불과하므로 64K UTF-8 바이트 만 보유 할 수 있습니다. 당신은 100k를 쓰려고 노력하고 있습니다. 그것은 작동하지 않을 것입니다.

이 한도는 하드 코딩되어 있으며 이것을 둘러 볼 방법이 없습니다.

if (utflen > 65535)
    throw new UTFDataFormatException(
            "encoded string too long: " + utflen + " bytes");

다른 팁

byte[] asciiBytes = ...;
String unicode = new String(asciiBytes, "US-ASCII");
byte[] utfBytes = unicode.getBytes("UTF-8");

어느 ANSI CodePage? "ANSI"를 모두 언급하는 다른 문자 인코딩이 많이 있습니다. DOS CodePage는 437 (도면 기호 없음)입니다. CodePage 850을 사용하는 경우 다음이 작동합니다.

String unicode = new String(bytes, "IBM850");

(어디 bytes ANSI 문자가있는 배열). 그런 다음이 문자열이 인코딩을 사용하여 바이트 어레이로 변환 할 수 있습니다. unicode.getBytes(encoding).

Windows는 종종 CodePage 1252를 사용합니다 (이를 위해 "Windows-1252"사용).

ZZ 코더는 이미 질문에 대답했지만 더 자세한 설명을 작성하고 해결 방법을 제안했습니다. 이 블로그. 기본적으로 문제는 DataOutputStream에 있습니다. 쓰기 가능한 문자열을 64KB로 제한하기 때문입니다. 문제를 바꾸는 다른 해결 방법이 있으며, 일부는 사용중인 실제 이진 데이터 형식을 깨지 않고 작동 할 수 있습니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top