http://bjoern.hoehrmann.de/utf-8/decoder/dfa/
у пользовательский кроссплатформенный минималистичный 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 могут содержать любые символы, поэтому я не могу выбрать символ в качестве терминатора - я не хочу путаться с его экранированием в данных.