Символ  (спецификация UTF-8) в середине ответа ASP.NET из-за HttpResponse.TransmitFile()

Я видел этот пост:  символы, добавленные к начало каждого файла.

В этом случае автор вручную читал исходный файл и записывал содержимое. В моем случае я абстрагирую его через HttpRequest.TransmitFile ():

public void ProcessRequest(HttpContext context)
{
    HttpRequest req = context.Request;
    HttpResponse resp = context.Response;

    resp.ContentType = "application/javascript";

    resp.TransmitFile("foo.js");
    resp.TransmitFile("bar.js");
    resp.TransmitFile("baz.js");
}

Файлы .js действительно закодированы в UTF-8. Это означает, что  BOM неправильно отображается в начале каждого файла, кроме первого.

Преимущества функции TransmitFile() заключаются в том, что (а) она абстрагирует весь процесс чтения+записи и (б) она оптимизирована таким образом, чтобы сначала не считывать файлы в память, что чрезвычайно важно, когда файлы большие и/или у вас много одновременных запросов. Но обратная сторона в том, что я не могу перекодировать его в UTF-8 без спецификации. (Думаю, это пример дырявой абстракции.)

Есть ли элегантный способ решить эту проблему? Спасибо!


person Aseem Kishore    schedule 04.09.2009    source источник
comment
Действительно ли это проблема на практике? Спецификация представляет собой пробельный символ (неразрывный пробел нулевой ширины, кодовая точка U+FFFE). Интерпретатор JS задыхается от этого?   -  person Jeffrey Hantin    schedule 04.09.2009
comment
Самое главное, что IE7 и ниже давятся этим (недопустимый символ). Менее важный, но все же раздражающий, JSLint задыхается от этого.   -  person Aseem Kishore    schedule 04.09.2009
comment
Я не думаю, что TransmitFile на самом деле делает какие-то волшебные оптимизации для передачи, ничего, что вы не могли бы воссоздать с потоковыми насосами чтения/записи.   -  person meandmycode    schedule 06.09.2009
comment
@meandmycode извините за поздний ответ, но да, вы правы, если вы читаете/записываете необработанные байты. Если вы читаете/записываете текстовое содержимое в виде строк, вы не видите этой проблемы.   -  person Aseem Kishore    schedule 20.03.2011


Ответы (1)


Замкнув цикл на этом: TransmitFile() передает необработанные байты файла, поэтому, если файлы закодированы в UTF-8 со спецификацией, и вы передаете несколько файлов, вы передадите несколько спецификаций.

Если вы сами читаете файлы в память как строки и передаете эти строки, вы не столкнетесь с этой проблемой. В итоге мы просто кодировали файлы как UTF-8 без спецификации или как ANSI.

person Aseem Kishore    schedule 20.03.2011