2013-06-17 1 views
2

У меня есть текстовый файл в UTF-8, который мне нужно перемещаться по C. Мне нужно разбить этот файл на отдельные файлы меньшего размера (т. Е. Разрезать пополам). Когда это происходит, он иногда разбивает многобайтовые символы на два разных файла. Когда немой текстовый редактор переходит к чтению файла, содержащего вторую половину текста, он считывает вторую половину символа разреза и путается, поэтому не отображает остальную часть текста правильно. Если я читаю побайтовые байты, как я могу узнать, есть ли я в начале персонажа или посередине? Совместимые с не-ascii символы UTF-8 начинаются с того, что старший бит установлен в 1, но некоторые из них являются двумя байтами, а некоторые - тремя байтами.Как перемещаться по текстовому файлу UTF-8

Редактировать: Nevermind, я только что узнал, что первый байт содержит число ведущих 1s, что символ длинный. IE трехбайтовый символ - 1110xxxx xxxxxxxx xxxxxxxx.

+0

Итак ... продвигайтесь, пока не нажмете ведущую байт ?! –

+2

Разделение его на терминаторе линии было бы разумным, '' \ n''. –

+2

Кстати, просто расщепление на границах кода не будет работать. Если раскол происходит между сочетанием символов (например, буквы и диакритики, или в середине последовательности Хангюла, вы также получите проблемы с рендерингом. – rici

ответ

2
if ((*s & 0xc0) == 0x80) /* You are in the middle of */; 
0

Все символы UTF-8 состоят из ведущего байта и ноль или более байтов продолжения. Все байты продолжения имеют форму «10xxxxxx» в двоичном формате. Таким образом, все ведущие байты имеют одну из двух форм: «0xxxxxxx» или «11xxxxxx».

1

Обозначения UTF-8: 1 - 4 байта.

Проверить байт, если у вас есть этот двоичный шаблон:

10xxxxxx 

вы находитесь в середине многобайтного. И вы должны продолжить следующий ведущий персонаж.

Если у вас есть это:

0xxxxxxx 

у вас есть 1-байтовый символ а.

110xxxxx 

является ведущим байт 2-байтового символа в

1110xxxx 

является ведущим байт 3-байтового символа в

и

11110xxx 

является ведущим байт 4-байтового символа

Смежные вопросы