2013-03-28 6 views
3

Я не знаю, заканчивается ли строка «\ n» или «\ r» или «\ r \ n» и не то, что текст закодирован Кроме того, если кодировка является utf-8, она не может быть bom. Есть ли функция или lib может это сделать или просто сказать мне о завершении строки.Как определить конец строки с помощью c

+0

См. Этот вопрос: http://stackoverflow.com/questions/1279779/what-is-the-difference-between-r-and-n – SolarBear

+1

Если вы не знаете кодировку, это невозможно сделать с уверенностью. Рассмотрим последовательность байтов '30 0A'. Если вы не знаете кодировку, невозможно определить, является ли это ASCII-представление числа «0», за которым следует строка, или представление UTF16-BE символа «» ». Итак, сначала вам нужна библиотека, чтобы угадывать кодировку символов, тогда вы можете думать о разрывах строк. –

+0

Вы имеете в виду любую кодировку текста, или это всегда ASCII/UTF-8, но с разными терминаторами строк? – teppic

ответ

1

Ты случайно используя fgets, fread, fputs, fwrite и т.д., на файл, который открыт для чтения текста? Если это так, реализация автоматически преобразует терминаторы линий конкретной ОС (например, "\r\n") в '\n' при чтении и преобразует '\n' в терминалы линии, специфичные для ОС при записи.


Есть два других сценарии, один из которых выясняется была OP:

  1. OP борется с "\r\n" быть перенесена из другого программного обеспечения операционной системы, и поэтому открытие файлов для чтения в его (предположительно Unix-подобная) ОС больше не будет конвертировать это. Мое предложение состоит в том, чтобы использовать dos2unix для этих одноразовых конверсий, вместо того, чтобы раздувать ваш код тем, что, скорее всего, никогда не запустится снова.
  2. Вы не используете одну из этих функций. Это может быть связано с тем, что вы используете поток, такой как сокет, и, возможно, для протокола требуется "\r\n". В этом случае вы должны использовать strstr, чтобы найти точную последовательность "\r\n".

UTF-8 был разработан с определенной степенью совместимости с ASCII в виду, следовательно, можно предположить, что любая система, которая использует UTF-8 также будет использовать ASCII или некоторый подобный набор символов. Любые символы, которые используют последовательности размером более одного байта, будут использовать только значения 0x80 или больше для представления. Поскольку '\n' находится в диапазоне 0x00-0x7F, вам гарантировано, что он будет одним байтом, и он не будет существовать как часть многобайтового символа.

+0

К сожалению, при чтении в текстовом режиме он не будет превращаться в '\ r \ n', не зависящий от ОС, в' \ n'. Поэтому, если вам нужно решить, что кто-то копирует текстовый файл из Windows в Linux, вам нужно другое решение. –

+0

Правда, я должен обрабатывать источник из разных ОС ... – choury

+0

@SteveJessop Хотя я согласен с тем, что это раздражает, когда кто-то смешивает кодировки, существуют утилиты, которые выполняют это преобразование для вас. Зачем изобретать колесо? Если вы потратите пятнадцать минут на каждую окончательную строку, зависящую от конкретной ОС, то вы получите очень сложное решение простой проблемы. – Sebivor

1

Используйте wcslen, чтобы получить размер в байте строки utf8.

http://linux.die.net/man/3/wcslen

+1

Что это связано с завершением строки? – Sebivor

+0

Но как это мне помогает? – choury

+0

За исключением случаев, когда он использует какое-то отображение памяти в своем источнике, у него, вероятно, будет строка внутри массива char. Он также сказал, что это может быть utf8. Наличие размера в байтах строки utf8 также дает реальный размер строки, start + size = конец строки. –

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