如何用c来判断一行的结尾

如何用c来判断一行的结尾,c,text,encode,C,Text,Encode,我不知道该行是否以“\n”或“\r”或“\r\n”结尾 并且不知道文本是用什么编码的,此外,如果编码是utf-8,它可以是无bom的。 是否有函数或库可以执行此操作,或者只告诉我行的终止。使用wcslen获取utf8字符串的字节大小 您是否碰巧在打开阅读文本的文件上使用了fgets、fread、fputs、fwrite等?如果是这样,该实现将在读取时自动将操作系统特定的行终止符(例如,“\r\n”)转换为'\n',并在写入时将'\n'转换为操作系统特定的行终止符 还有两种情况,其中一种是OP:

我不知道该行是否以“\n”或“\r”或“\r\n”结尾 并且不知道文本是用什么编码的,此外,如果编码是utf-8,它可以是无bom的。
是否有函数或库可以执行此操作,或者只告诉我行的终止。

使用wcslen获取utf8字符串的字节大小


您是否碰巧在打开阅读文本的文件上使用了
fgets
fread
fputs
fwrite
等?如果是这样,该实现将在读取时自动将操作系统特定的行终止符(例如,
“\r\n”
)转换为
'\n'
,并在写入时将
'\n'
转换为操作系统特定的行终止符


还有两种情况,其中一种是OP:

  • OP正在努力解决从其他操作系统软件中继承下来的
    “\r\n”
    ,因此在他的操作系统(可能类似于Unix)中打开文件进行读取将无法再转换这一点。我的建议是对这些一次性转换使用
    dos2unix
    ,而不是用一些可能永远不会再次运行的东西来填充代码
  • 您没有使用这些函数之一。这可能是因为您使用的是套接字之类的流,并且协议可能需要
    “\r\n”
    。在这种情况下,您应该使用
    strstr
    查找确切的序列
    “\r\n”


  • UTF-8的设计考虑到了与ASCII的兼容性,因此您可以假设任何使用UTF-8的系统也将使用ASCII或类似的字符集。使用大于一个字节的序列的任何字符将仅使用0x80或更大的值来表示。由于
    '\n'
    位于0x00-0x7F范围内,因此可以保证它是一个单字节,并且不会作为多字节字符的一部分存在。

    请看这个问题:如果您不知道编码,那么就不能确定地进行编码。考虑字节序列<代码> 30 0A < /代码>。除非您知道编码方式,否则无法判断这是数字“0”后跟换行符的ASCII表示,还是字符“0”的UTF16-BE表示。因此,首先你需要一个库来猜测字符编码,然后你可以考虑换行符。你是说任何文本编码,还是说它总是ASCII/UTF-8,但有不同的行终止符?@teppic不,它不是,它也可以是GBK。@SteveJessop如果你假设它是GBK编码,那么终止符是'\r\n',如果是utf8,那么编码终止符是'\n',那么有更好的方法吗?这与行终止有什么关系?除非他在源代码中使用某种内存映射,否则他可能会将行放在字符数组中。他还说它可以是utf8。utf8字符串的字节大小也会给出字符串的实际大小,start+size=行的结尾。但是source只是纯文本(不仅仅是英文)。因为它是在*nix或windows(不是由我创建的),所以格式不是特定的。那么可以看看EncaEnca是一个非常简单的字符集分析器。它检测文本文件的字符集和编码,还可以使用内置转换器或外部库和工具(如libiconv、librecode或cstocs)将其转换为其他编码。"然后调整程序的工作方式和编码OK,我将查看它的源文件,看看我是否能找到一些在文本模式下阅读的东西,它不会在阅读时将非操作系统特定的
    \r\n
    转换为
    \n
    。因此,如果你需要处理有人从Windows复制文本文件的可能性对于Linux,您需要另一种解决方案。@SteveJessop虽然我同意有人混淆编码很烦人,但现有的一些实用程序可以为您执行此转换。为什么要重新发明轮子?如果您花15分钟来解释每个操作系统特定的行结束,那么您将得到一个非常复杂的解决方案,以实现简单的转换问题。@choury您的程序处理不同的操作系统是常见的问题,还是您的程序很少处理的问题(例如,您的程序是否主要处理在同一操作系统上生成的文本文件)?当您可以使用其他程序为您执行转换时,为什么要引入膨胀(例如,
    dos2unix
    unix2dos
    ),在您的程序之外?@modifiablelvalue是的,大部分文件来自同一个操作系统,但其余的也必须处理。我不知道文件来自哪个操作系统。@choury啊,所以您计划将LF解释为Unix的行终止符,将CR+LF解释为MS-DOS/Windows的行终止符(Windows 7之前的版本)、LF+CR作为RISC操作系统的行终止符、CR作为MacOS(MacOSX之前的版本)的行终止符、RS作为QNX的行终止符、NL作为z/OS的行终止符,以及更多的新行?这太夸张了……你也打算将
    'N'
    解释为新行吗?