Я пишу собственный кроссплатформенный минималистичный TCP-сервер на простом C89. (Но я также приму специфичный для POSIX ответ.)
Сервер работает со строками UTF-8, но никогда не заглядывает внутрь них. Он обрабатывает все строки как неизменяемые двоичные объекты.
Но теперь мне нужно принять строки UTF-8 от клиента, который не знает, как рассчитать их размер в байтах. Клиент может передавать только длину строки в символах. (Обновление: клиент в JavaScript, и "длина в символах" фактически равна тому, что возвращает String.length()
. Я предполагаю, что это фактические символы UTF-8, а не что-то еще.)
Я не хочу добавлять тяжелые зависимости на мой крошечный сервер. Есть ли надежный и аккуратный способ прочитать эту дейтаграмму? (Ради этого вопроса, скажем, что он читается из FILE *
.)
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 могут содержать любые символы, поэтому я не могу выбрать символ в качестве терминатора - я не хочу путаться с его экранированием в данных.