Цель:
Загрузить/отправить файл CSV с символами UTF-8 в действие MVC, прочитать данные и вставить их в таблицу базы данных.
Проблема:
Проходят только обычные текстовые символы. «Специальные» символы UTF-8, такие как á, не проходят правильно, в коде и в базе данных они отображаются как этот символ => �.
Подробнее:
Я убежден, что это не проблема с моим кодом C#, хотя я включил важные части ниже.
Я думал, что проблема в том, что загруженный файл закодирован как обычный текст или "простой/текстовый" тип MIME, но я смог изменить это, изменив расширение файла на .html
Резюме:
Как получить форму с атрибутом enctype со значением «multipart/form-data», чтобы правильно интерпретировать символы UTF-8 в опубликованном файле?
Исследования:
Судя по моим исследованиям, это общая проблема, не имеющая общего и ясного решения.
Я нашел больше решений для java и PHP, чем для .Net.
переменная csvFile имеет тип HttpPostedFileBase
это сигнатура действия MVC
[HttpPost]
public ActionResult LoadFromCsv(HttpPostedFileBase csvFile)
Что я пробовал:
1)
using (Stream inputStream = csvFile.InputStream)
{
byte[] bytes = ReadFully(inputStream);
string bytesConverted = new UTF8Encoding().GetString(bytes);
}
2)
using (Stream inputStream = csvFile.InputStream)
{
using (StreamReader readStream = new StreamReader(inputStream, Encoding.UTF8, true))
{
while (!readStream.EndOfStream)
{
string csvLine = readStream.ReadLine();
// string csvLine = new UTF8Encoding().GetString(new UTF8Encoding().GetBytes(readStream.ReadLine())); // stupid... this can not be the way!
}
}
}
3)
<form method="post" enctype="multipart/form-data" accept-charset="UTF-8">
4)
<input type="file" id="csvFile" name="csvFile" accept="UTF-8" />
<input type="file" id="csvFile" name="csvFile" accept="text/html" />
5)
Когда файл имеет расширение .txt, свойство ContentType базы данных HttpPostedFileBase имеет значение "текст/обычный"
Когда я изменяю расширение файла с .txt на .csv, свойство ContentType базы данных HttpPostedFileBase имеет значение application/vnd.ms-excel"
Когда я изменяю расширение файла на .html, свойство ContentType базы данных HttpPostedFileBase имеет значение "text/html" — я думал, что это будет победителем, но это не так.
В душе я должен верить, что есть простое решение этой проблемы. Меня удивляет, что я не смог разобраться с этим самостоятельно, загрузка символов UTF-8 в файл - обычная задача! Почему я терплю неудачу здесь?!?!
Возможно, мне нужно настроить MIME-типы в IIS для веб-сайта?
Возможно, мне нужны другие теги DOCTYPE/html/метатеги?
@Gabe -
Вот как мой пост выглядит в Fiddler. Это действительно интересно, потому что � просто как день, прямо в значении сообщения.
http://localhost/AwesomeGeography/GeoBytesCities/LoadFromCsv?adsf HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/AwesomeGeography/GeoBytesCities/LoadFromCsv?adsf
Content-Type: multipart/form-data; boundary=---------------------------199122566726299
Content-Length: 354
-----------------------------199122566726299
Content-Disposition: form-data; name="csvFile"; filename="cities_test.html"
Content-Type: text/html
"CityId","CountryID","RegionID","City","Latitude","Longitude","TimeZone","DmaId","Code"
3344,10,1063,"Luj�n de Cuyo","-33.05","-68.867","-03:00",0,"LDCU"
-----------------------------199122566726299--