2011-02-09 2 views
3

입력이 UTF16LE 인코딩입니다. 이 입력이 내 코드에 도달 할 때까지 LineNumberReader에 낀 FileReader로 둘러싸인 FileInputStream을 통과했습니다.Java 문자열에 불필요한 데이터가 포함되어 있습니다.

[, 1, p, i, ...]

공지 빈 요소 :

"1 piece of data like a string"

그러나,이 String에 값을 찾고의 라인을 따라 뭔가있을 것입니다 : 첫 번째 행은

는 같은 문자열을 제공합니다 스타트.

없음이 문자열이 여기 저기 기능의 몇 통과 Object로 변환하지 않고 기본적으로 그 보를 통해 넣어되고있다. 특정 시점에서, 문자열의 첫 번째 부분 만 (내 경우에는 십진수를 포함한 모든 숫자) 함수를 전달하여 실제 숫자로 구문 분석해야합니다.

이 String의 내용은 "1" 될 것처럼 보이지만 값에 말한다 :

[, 1, p, i, ...]

때문에 전체 문자열이 여전히있다.

어쨌든 ParseException을 반환하고 해석 할 수없는 숫자를 예외 메시지에 인쇄하고 "1"은 분석 할 수없는 숫자라고 기록합니다.

진짜 문제는 이후의 라인이 선두 빈 요소를 제외하고 비슷한 동작을 표시하고 구문 분석으로 최고의 빈 요소로 나타납니다.

+1

"그러나이 문자열을 살펴보면 값은 [, 1, p, i, ...]의 행을 따라 표시됩니다. 그건 말이되지 않습니다. String의 요소를 어떻게 확인 했습니까? Java 문자열은'char's의 순서이고, "빈 char"같은 것은 없습니다. 디버깅 할 때 정확히 무엇을 보았습니까? – sleske

+3

sleske가 말했듯이, "empty"요소는 실제로 비어 있지 않습니다. 어떤 코드 포인트인지 알아보기 위해 숫자 값을 출력해야합니다. 내 생각 엔 BOM과 관련이있을 수 있다는 것입니다. – musiKk

+0

이것은 BOM (내 이야기에 추가해야합니다)이지만 UTF16LE은 BOM을 가질 수 없으므로 LE는 이미 그렇게 말합니다. 그렇더라도 파서 인코딩은 명시 적으로 UTF16LE로 설정됩니다. 이클립스 디버거를 통해 문자열의 내용을 식별하고 내가 쓴 것은 이클립스가 내용이라고 말한 것입니다. –

답변

0

나는 대답을 가지고 있다고 생각합니다. 인코딩은 UTF16LE가 아니 었습니다. 자동 문자 감지 알고리즘에 의해 UTF16LE로 설정되었습니다. 인코딩은 BOM이있는 utf16입니다. 그러나 다양한 클래스가 인코딩이 UTF16LE 인 것으로 생각했기 때문에 BOM을 제거하지 못했습니다. BOM은 LE 버전에 있어서는 안됩니다.

+0

btw gvim은 또한 파일을 UTF16LE로 식별합니다. 나는 소스 파일을 만들지 않았고 테스트 환경 밖에서도 기대할 수 없었고, 나는 종종 인코딩을 추측해야했다. –

2

String (적어도 OpenJDK의 구현체)은 오프셋과 카운트 인 char[]을 저장합니다. String의 실제 내용은 에있는 문자이며 offset 인 색인은 offset+count입니다. String 실제로 나타내는 것보다 char[]이 더 많은 문자를 저장할 수 있다는 것을 의미

.

다른 String 인스턴스간에 char[]을 공유 할 수 있도록하기 위해 수행되었습니다. 당신이 값 foobarString가 있고 그것에 .substring(3)를 호출하는 경우

는 예를 들어, 결과 Stringbar를 대표 할 것입니다,하지만 그들은 같은 char[]를 참조 실제로 수 있습니다. 두 번째 String은 원래 String보다 3 크고 3이 더 작은 count 인 크기가 offset입니다.

String 개체가 진정으로 변경 불가능하기 때문에이 모든 작업이 가능합니다. 어떤 String도 수정하지 않으므로 공유하는 것이 안전합니다.

이 디버거에 String 개체를 검사하는 것은 잘못된 인상을 줄 수 있다는 것을 의미한다. 따라서 String 문자를 검사하려면 가장 쉬운 방법은 toCharArray()을 호출하거나 charAt()을 호출하는 것입니다.

+0

감사합니다. 매우 명확합니다. 이것은 디버거가 대체해야하는 디버그 코드를 추가하는 것을 의미하는 불행한 일입니다. 그것이 바로 어떻게 진행됩니다. –

+0

@ Jasper : 음,'String' 디스플레이는 시간의 99 %의 정확하고 정확한 값을 보여줍니다 (즉,'String'에는 인쇄 가능한 문자 만 포함됨). 그리고 다른 시간에 디버거에서 직접 작은 코드 조각을 실행할 수 있어야합니다 : 프로덕션 코드에 추가 할 필요가 없습니다. –

관련 문제