2011-09-28 2 views
0

UTF-16 형식의 파일에서 특정 문자를 얻으려고합니다.유니 코드 문자를 건너 뛸 수있는 가장 빠른 방법은 무엇입니까

내가 건너 뛰고 싶은 문자의 수를 알고 있습니다. 현재 건너 뛰려는 모든 문자의 임시 배열을 읽으려면 TextReader.ReadBlock 명령을 사용하고 있지만 위치를 설정하는 것이 더 빠를 것이라고 생각합니다. 나는 새로운 위치를 결정하는 방법을 모르겠습니다.

건너 뛰고 싶은 문자가 몇 개인 경우 유니 코드 파일의 위치로 건너 뛸 수있는 가장 빠른 방법은 무엇입니까?

+0

파일 및 건너 뛰기 블록의 크기는 어느 정도입니까? –

+0

그들은 gotton 최대 100 메가 바이트를 가지고 – Nick

+0

utf - 16 인코딩의 문제에서 짧은, 당신은 얼마나 많은 cr/lf 라인 끝 문자를 실제로 파일을 읽지 않고 건너 뛸 수 있는지 알 수 없습니다. –

답변

0

상대 위치 지정이 필요한 블록을 건너 뛰는 것은 그리 쉽지 않습니다.

당신은 그것을 행할 (파일의 선두로부터의 오프셋 (offset)) 다음 블록의 begiining을 계산할 수있는 경우 :

 int nextPos = ...; 

     reader.DiscardBufferedData(); 
     reader.BaseStream.Position = nextPos; 
     line = reader.ReadLine(); 

당신은 UTF-16 파일이 BOM을 가질 수 있기 때문에 귀하의 계산을 조정할 수있다 (선행 2 바이트).

-1

이 문자는 UTF-16이고 UTF-8 (문자 크기가 다를 수 있음)이 아니라 문자 당 2 바이트입니다. 따라서 x 문자를 건너 뛰려면 x * 2 바이트를 건너 뜁니다.

+0

UTF-16에는 pseuo-pairs (4 바이트/char)도 포함될 수 있습니다. 아주있을 법하지는 않지만 여전히. TexReader와 Stream을 까다롭게 동기화해야합니다. –

+0

결합 문자, 대리 문자 등을 무시하는 경우에만 해당됩니다. –

+0

@Henk : 알고있는 한 대리모는 .NET에서 2 바이트 2 바이트 쌍으로 분할됩니다. 그래서 그들은 일반 규칙에 "적합"해야합니다. – Tigran

관련 문제