C 如何导航UTF-8文本文件

C 如何导航UTF-8文本文件,c,parsing,utf-8,C,Parsing,Utf 8,我有一个UTF-8格式的文本文件,我需要在C中导航。我需要将该文件拆分为单独的较小文件(即,将其切成两半)。发生这种情况时,它有时会将多字节字符拆分为两个不同的文件。当哑文本编辑器读取包含后半部文本的文件时,它会读取剪切字符的后半部并变得混乱,从而无法正确显示其余文本。如果我一个字节一个字节地读,我怎么知道我是在字符的开头还是在中间?不兼容ascii的UTF-8字符都以设置为1的前导位开始,但有些是两个字节,有些是三个字节 Edit:Nevermind,我刚刚发现第一个字节包含字符长的前导1数。

我有一个UTF-8格式的文本文件,我需要在C中导航。我需要将该文件拆分为单独的较小文件(即,将其切成两半)。发生这种情况时,它有时会将多字节字符拆分为两个不同的文件。当哑文本编辑器读取包含后半部文本的文件时,它会读取剪切字符的后半部并变得混乱,从而无法正确显示其余文本。如果我一个字节一个字节地读,我怎么知道我是在字符的开头还是在中间?不兼容ascii的UTF-8字符都以设置为1的前导位开始,但有些是两个字节,有些是三个字节


Edit:Nevermind,我刚刚发现第一个字节包含字符长的前导1数。即三字节字符是1110xxxx xxxxxxxxxxxxxxxxxxxx。

所有UTF-8字符都由一个前导字节和零个或多个连续字节组成。所有的延续字节都是二进制格式的“10xxxxxx”。因此,所有前导字节都是两种形式之一:“0xxxxxxx”或“11xxxxxx”。

UTF-8字符用1到4个字节表示

如果您有以下二进制模式,请检查一个字节:

10xxxxxx

你处于一个多字节的中间。你应该继续演下一个主角

 110xxxxx
如果您有:

0xxxxxxx
您有一个1字节字符

 110xxxxx
是2字节字符的前导字节

 1110xxxx
if ((*s & 0xc0) == 0x80) /* You are in the middle of */;
是3字节字符的前导字节

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


是4字节字符的前导字节

。。。前进,直到到达前导字节?!在行终止符处拆分它是明智的,
'\n'
。顺便说一句,仅在代码点边界处拆分也不起作用。如果分裂发生在组合字符(例如,字母和diaCiple,或者在HANGUL序列中间),则也会出现渲染问题。@ RICI:是的,但是它仍然会产生有效的,尽管是UTF-8文件。@ R.:有效,是的。但是它们可能不能正确显示,这是我理解的问题的一部分。“行不通”太极端了。
 1110xxxx
if ((*s & 0xc0) == 0x80) /* You are in the middle of */;