Для данных, передаваемых по HTTP, длина контента должна быть числом байтов в данных , как отмечено в проводе . При работе с Httpd_ReturnData
необходимо убедиться, что вы предоставили двоичные данные для передачи; он не обрабатывает для вас кодирование данных.
Для отправки двоичных данных с длиной это на самом деле просто, и вы делаете:
set binaryData [...]
Httpd_ReturnData $sock "application/octet-stream" $binaryData
# There are many other binary encodings; that's just the most universal one
# Choose the right one for your application, of course
Чтобы отправить текстовые данные с длиной, вам нужно немного больше поработать с encoding convertto
:
set textData [...]
Httpd_ReturnData $sock "text/plain; charset=utf-8" \
[encoding convertto utf-8 $textData]
# Similarly, text/plain is a decent fallback here too
(Да, если вы выберете другую кодировку, вы должны упомянуть об этом в обоих местах. Вам, вероятно, следует использовать UTF-8 для всего текстового содержимого в этот день и возраст.)
Если вы можете извлечь данные из файла, вы должны это сделать;Httpd_ReturnFile
более эффективен, чем Httpd_ReturnData
, поскольку он может перемещать данные, используя эффективные методы передачи данных. При отправке текстового файла, вы должны быть осторожны, чтобы правильно описать кодировку файла. Безусловно, самый простой способ сделать это - по соглашению, например, решить, что все текстовые файлы в вашей системе имеют формат UTF-8 ...
Вы практически никогда не должны использовать string bytelength
, так как это сообщаетв единицах, которые являются одним из внутренних кодировок Tcl (слегка денормализованный почти-UTF-8). Мера, которую он возвращает, верна только тогда, когда вы делаете что-то очень странное, например, генерируете код на C, который должен знать размеры буфера, содержащие строки, которые будут переданы в реализацию Tcl, а это совсем не то, что вы делаете (делал подобные вещи только один раз за более чем 20 лет использования Tcl; я никогда не слышал о другом законном использовании). Я считаю, что он устарел именно потому, что в нем слишком много мелких ошибок в том, как его используют слишком многие люди.