2011-02-08 7 views
5

필자는 가끔씩은 대리 바이트 (예 : 동부 언어에서 사용됨) 때문에 UTF8 또는 UTF16 인 코드 파일을 반드시 임의로 읽을 수는 없다는 점을 이해했습니다.UTF8 파일을 임의로 읽는 방법은 무엇입니까?

.NET을 사용하여 파일 내의 대략적인 위치로 건너 뛰고 세미 임의의 위치에서 유니 코드 텍스트를 읽을 수있는 방법은 무엇입니까?

대리 바이트를 버리고 계속 단어 나누기를 기다리나요? 그렇다면 디코딩을 시작할 때까지 기다려야 할 valid word breaks은 무엇입니까?

답변

8

쉬운 UTF-8은 자동으로 동기화됩니다.
단순히 파일의 임의의 바이트로 건너 뛰고 건너 뛰기 읽기 모든 바이트의 앞쪽 비트는 10 (연속 바이트)입니다. 선두가 10이 아닌 첫 번째 바이트는 적절한 UFT-8 문자의 시작 바이트이며 일반 UTF-8 인코딩을 사용하여 다음 바이트를 읽을 수 있습니다.

+1

홀수 바이트 위치로 이동하지 않으면 UTF-16이 자동으로 동기화됩니다. 유니 코드 인코딩은 특히 자체 동기화되도록 설계되었으며 적은 수의 코드 단위 만 건너 뛸 수 있다는 강력한 보장이 있습니다. – Philipp

2

UTF-8 파일에서 의사 무작위 문자를 추출한다고 가정 할 때, 나는 개인적으로 임의의 장소로 점프하는 방법을 생각하고 앞으로 ' 문자 '위치 (내 느낌은 까다로운 제안이 될 것입니다) 이 부분은입니다. 어떻게 같은 약 :

  1. 는 경험적으로 문자 수를 추측 바이트 파일의 길이를 설정합니다 - 예를 들어, 어떤 적합한 신체에서 설립 된 상수에 의해 스케일링에 의해; 또는이 파일
  2. 파일이 매우 큰 경우 1..<guessed number of characters in file>
  3. 의 의사 난수를 선택보다 잘 나타내는 수 있습니다 스케일링 상수를 얻기 위해, 그들은 설명 얼마나 많은 문자를 처음 n 바이트를 검사하고보고하여 (필자가 추측하고있는 것, 그렇지 않다면 요청하지 않을 것입니다.) 버퍼링 된 읽기를 사용하여 다음을 수행하십시오.
  4. 원하는 문자에 도달 할 때까지 파일의 바이트를 읽고 UTF-8로 디코딩하십시오. 파일 끝에서 벗어나면 마지막 바이트를 사용하십시오.

여기서 버퍼링 된 읽기는 두 개의 버퍼를 두 번 읽는 동안 문자의 바이트가 분할 될 때 컨텍스트를 잃지 않도록 '첫 번째'로 교체해야합니다. :

읽기 버퍼 A : 바이트 1,000에서 1,999 사이 읽기 버퍼 B : 바이트 2,000에서 2,999 사이

는 문자는 문맥을 잃게 하나의 버퍼를 사용하여 바이트를 1998-2001을 차지합니다.

읽기 완충액 A

: 바이트 3000-3999

는 현재 시행되고있는 우리가 문자로 바이트 스트림으로 변환 할 때 버퍼 B를 다음 버퍼. 아래 @jleedev에 의해 언급, 다른 대답에서 볼 수 있듯이, 그것은 이 보장 된 문자 시작으로 '앞으로 스크롤'에 실제로 쉽고 안전하게으로


. 그러나 위의 문자 수 추정치는 여전히 유용 할 수 있습니다.

+1

UTF-8은 주위를 뛰어 넘으면 캐릭터의 시작 부분을 쉽게 찾을 수 있도록 특별히 설계되었습니다. –

+0

@jleedev 쿨, 고마워. 업데이트 됨. – AakashM

1

UTF-16의 경우 항상 짝수 바이트 위치로 이동해야합니다. 그런 다음 후행 대리인이 뒤따를 지 여부를 확인할 수 있습니다. 그렇다면 건너 뜁니다. 그렇지 않으면 잘 구성된 UTF-16 코드 단위 시퀀스가 ​​시작됩니다 (항상 파일이 잘 형성되었다고 가정 할 때).

유니 코드 인코딩 UTF-8 및 UTF-16은 특히 자체 동기화되도록 설계되었으며 적은 수의 코드 단위 만 건너 뛸 수 있다는 강력한 보장이 있습니다.

관련 문제