Я пишу собственный кроссплатформенный минималистичный TCP-сервер на простом C89. (Но я также приму ответ, относящийся к POSIX.)
Сервер работает со строками UTF-8, но никогда не заглядывает внутрь них. Он обрабатывает все строки как неизменяемые двоичные капли.
Но теперь мне нужно принимать строки UTF-8 от клиента, который не знает, как рассчитать их размер в байтах. Клиент может передавать только длину строки в символах. (Обновление: клиент использует JavaScript, и "длина в символах" фактически зависит от того, что возвращает String.length ()
. Я предполагаю, что это настоящие символы UTF-8, а не что-то еще .)
Я не хочу добавлять тяжелые зависимости к моему крошечному серверу. Есть ли надежный и удобный способ чтения этой дейтаграммы? (Ради этого вопроса предположим, что он читается из ФАЙЛА *
.)
U<CRLF> ; data type marker (actually read by dispatching code)
<SIZE><CRLF> ; UTF-8 string size in characters
<DATA><CRLF> ; data blob
Пример:
U
7
Юникод!
Обновление:
Один пакет данных может содержать более одной дейтаграммы, поэтому приблизительное чтение не будет работать, мне нужно прочитать точное количество символов.
Фактические данные UTF-8 могут содержать любые символы, поэтому я не могу выбрать символ в качестве терминатора - я не хочу путаться с его экранированием в данных.