Предполагая, что вы хотите извлечь псевдослучайный символ из файла UTF-8, я лично откажусь от попыток понять, как прыгнуть в случайное место, а затем прокрутить вперед до гарантированного начала символа. 'позиция (что, как мне кажется, было бы сложным предложением) edit это неправильно . Как насчет чего-то вроде:
- Установить длину файла в байтах
- Эвристически угадать количество символов - например, путем масштабирования по константе, установленной из некоторого подходящего корпуса; или изучив первые
n
байтов и увидев, сколько символов они описывают, чтобы получить масштабную константу, которая могла бы быть более представительной для этого файла
- Выберите псевдослучайное число в
1..<guessed number of characters in file>
- Если файл очень большой (что, я полагаю, должен быть, иначе вы бы об этом не спрашивали), используйте буферизованное чтение для:
- Считайте байты файла, расшифровывая его до UTF-8, пока не достигнете нужного символа. Если вы упали с конца файла, используйте последний
Буферизованное чтение здесь должно будет использовать два буфера, которые поочередно являются «первыми», чтобы избежать потери контекста, когда байты символа разделены на два чтения, например:
Чтение буфера A: байты 1000-1999
Буфер чтения B: байты 2000-2999
Если символ занимает байты 1998-2001
, использование одного буфера приведет к потере контекста.
Чтение буфера A: байты 3000-3999
Теперь действует буфер A , следующий за буфером B, когда мы преобразуем поток байтов в символы.
Как отметил @jleedev ниже, и, как видно из другого ответа, - это на самом деле легко и безопасно «прокрутить вперед» до гарантированного начала символа. Но приведенная выше оценка количества символов может оказаться полезной.