FileInfo, StreamWriter и StringBuilder. Какую кодировку производит эта комбинация? - PullRequest
1 голос
/ 27 августа 2010

У меня есть список строк, которые я записываю в файл CSV.Я пишу этот файл так:

FileInfo outputFile = new FileInfo("c:\output.csv");
StreamWriter writer = outputFile.CreateText();
StringBuilder line = new StringBuilder();

// List<String> listOfItems = ...
for (int i = 0, j = listOfItems.Count; i < j; i++) {
  line.AppendFormat(" {0}", listOfItems[i]);
}

writer.WriteLine("col1,col2,{0}", line.ToString().Trim(' '));
writer.Close();

Когда я проверяю c:\output.csv с помощью таких инструментов, как Notepad ++ или enca , файл выглядит как обычный текст с кодировкой us-ascii.Но когда мой клиент загружает CSV в свой интернет-магазин, столбец, созданный с StringBuilder, имеет следующий формат:

:VAL1 :VAL2 :VAL3 ... :VALN

Этот столбец должен быть на самом деле:

val1 val2 val3 ... valN

Обратите внимание, чтонеправильная строка имеет двоеточие с префиксом к каждому значению, а значения в верхнем регистре.

Единственное, что я могу понять, это проблема кодирования.Итак, какую кодировку сгенерирует приведенный выше код?

Обновление (1 сентября 2010 г.): Оказалось, что это ошибка отображения в удаленном интернет-магазине.Этот код выводит обычный текст, как и должно быть.

Ответы [ 2 ]

3 голосов
/ 27 августа 2010

Я не думаю, что это проблема кодирования.Я бы использовал какой-то сетевой монитор (например, NetMon или Fiddler), чтобы убедиться, что передаваемые данные - это то, что вы ожидаете.Я предполагаю, что интернет-магазин манипулирует данными после их загрузки.

1 голос
/ 27 августа 2010

Я запустил код, который вы представили, и просмотрел файл, созданный с помощью Hex Editor, он был закодирован в UTF8 / ASCII, так как единственное содержимое, которое я вижу в файле, - это вывод текста (в точности как написано) плюс комбинация CR + LF, вызванная тем, что вы используете WriteLine. Все, что вызывает преобразование файла в :VAL1 :VAL2 :VAL3, не имеет ничего общего с вашим кодом.

Тем не менее, строка for (int i = 0; j = listOfItems.Count; i < j; i++) не скомпилировалась для меня, мне пришлось настроить ее на for (int i = 0; i < listOfItems.Count; i++) - вы уверены, что это есть в вашем рабочем коде?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...