Как читать строку UTF-8 с учетом ее длины в символах в простом C89 ?

Я пишу собственный кроссплатформенный минималистичный 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 могут содержать любые символы, поэтому я не могу выбрать символ в качестве терминатора - я не хочу путаться с его экранированием в данных.

6
задан Alexander Gladysh 16 February 2012 в 23:40
поделиться