2014-11-22 4 views
2

웹 인덱싱과 비슷한 지정을해야합니다. 기본적으로 여러 파일 (ASCII 형식)이 있고 단어 빈도를 계산해야합니다.자바에서 프랑스어 문자 읽기

파일 중 하나에 프랑스어 문자 (예 : ç 또는 è)가 포함되어 있습니다. 내 출력 파일에서 프랑스어 문자가 포함 된 단어 중 일부는 올바르게 표시되지 않으며 중복으로 인해 나타납니다. grimaçaient와 grima aient가 있는데 예를 들어 guère와 gu re가 있습니다.

이제 사용 된 알고리즘과 관련하여 catch가 있습니다. 필자는 텍스트 파일을 여러 파일로 분할하지 않고 파일의 특정 오프셋을 읽는 방식으로 분할하는 병렬 방식으로 계산을 수행해야합니다. 각 조각마다 첫 번째 단어가 두 조각 사이에서 분리되었는지 확인해야합니다. 예인 경우 무시할 수 있으며 마지막 단어가 분할되었는지도 확인해야합니다. 예인 경우 더 많은 문자를 읽어야합니다 구분 기호에 도달 할 때까지 내 버퍼에 저장하십시오. 이상한 이이 부분과 관련 있다고 생각합니다.

byte[] buffer = new byte[D]; // D is 1024 
file.seek(offset); 
file.readFully(buffer); 

이 내가 주변 단어를 읽는 방법은 다음과 같습니다

이 내가 조각을 읽는 방법이다.

file.seek(offset - 1); 
byte[] buf = new byte[1]; 
buf[0] = file.readByte(); 
String first_w = new String(buf); 

마지막 단어의 경우 :

이 마지막 단어의 일부, 첫 번째 단어의 일부에 나타납니다
String last_word = ""; 
byte[] buf = new byte[1]; 
do 
{ 
    buf[0] = file.readByte(); 
    String aux = new String(buf); 
    if(isDelim(aux.charAt(0)) 
    { 
     break; 
    } 
    else 
    { 
     last_word += aux; 
    } 
}while(true); 

, 어쩌면 가장 중요한 첫 번째 단어를

사실 이 프래그먼트의 주요 부분 (readFully로 읽은 부분)에 나타나면 string이 문자열의 첫 번째 문자 또는 마지막 문자로 나타납니다.

나는이 문제를 어떻게 해결할 수 있습니까?

EDIT : 파일은 RandomAccessFile 개체입니다.

+0

UTF-8 또는 ISO-8859-15 파일 인코딩이란 무엇입니까? 몇 가지 중요한 차이가 있습니다. –

+0

파일에 ç 또는 é가 포함되어 있으면 ASCII가 해당 문자를 지원하지 않으므로 ASCII가 아닙니다.Reader와 적절한 charset을 바이트로 읽으 려하지 않고 문자로 읽습니다. 'new String (buf)'는 적절한 charset을 사용하지 않습니다. 기본 charset을 사용합니다. javadoc을 읽습니다. –

+0

인코딩은 ISO-8859 텍스트입니다. –

답변

1

RandomAccessFile으로 파일을 읽을 때 파일 인코딩을 제대로 처리 할 수있는 지원이 많지 않습니다.

파일이 ISO-8859-15의 인코딩 인 경우 매우 간단합니다. 이 경우 new String(byte[], "ISO-8859-15")을 사용할 수 있습니다.

파일이 UTF-8으로 인코딩 된 경우 유니 코드 코드 포인트가 127보다 큰 문자는 1 바이트 이상으로 인코딩된다는 사실을 처리해야합니다. 그러나 그것은 간단합니다. 첫 번째 비트가 0 (바이트 값> = 0)이면 1 바이트 문자입니다. 첫 번째 비트가 1 (바이트 값 < 0)이면 멀티 바이트 문자입니다. 두 번째 비트가 1이면 멀티 바이트 문자의 시작이고, 두 번째 비트가 0이면 멀티 바이트 문자의 데이터 바이트입니다. 모든 데이터 바이트를 읽고 배열에 추가하기 만하면됩니다.

0

new String(byte[] buf) 생성자를 사용하지 마십시오. 바이트의 인코딩을 고려하지 않으며 플랫폼 기본값을 사용합니다. new String(byte[] buf, String encoding)을 사용하고 올바른 인코딩을 지정하십시오.