Я думаю, что это какая-то проблема кодирования

У меня есть два компьютера. Оба работают под управлением WinXP SP2 (я не знаю, насколько они похожи). Я использую MS Visual C # 2008 Express Edition на обоих, и это то, что я сейчас использую для программирования.

Я сделал приложение, которое загружается в файл XML и отображает содержимое в DataGridView.

Первая строка моего XML-файла:

<?xml version="1.0" encoding="utf-8"?>

... и действительно ... это utf-8 (по крайней мере, в соответствии с MS VS C #, когда я просто открываю файл там).

Я компилирую код и запускаю его на одном компьютере, и содержимое моего DataGridView выглядит нормально. Нет смешных персонажей. Я компилирую код и запускаю его на другом компьютере (или просто беру опубликованную версию с компьютера № 1 и устанавливаю ее на компьютер № 2 - я пробовал это в обоих направлениях) и в сетке данных, где есть разрывы строк / новые строки в XML-файл, я вижу забавные квадратные символы.

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

Я не знаю, что еще делать или как решить эту проблему, или что я, возможно, принципиально делал неправильно во-первых.

-Adeena

11.12.2008 00:53:04
Я бы проверил, насколько похожи эти два компьютера, так как я думаю, что проблема связана с чтением «специальных» символов в файле, которые интерпретируются по-разному. На обоих компьютерах установлена ​​одинаковая версия .Net framework? На обоих компьютерах установлен один и тот же язык?
JB King 11.12.2008 21:40:16
4 ОТВЕТА
РЕШЕНИЕ

Я не уверен в причине вашей проблемы, но одним из решений было бы просто убрать возврат каретки из ваших строк. Для каждой добавляемой строки просто вызовите TrimEnd(null)ее, чтобы удалить конечные пробелы:

newrow["topic"] = att1.ToString().TrimEnd(null);

Если ваши строки могут заканчиваться другими пробелами (то есть пробелами или символами табуляции), и вы хотите сохранить их, просто передайте массив, содержащий только символ возврата каретки TrimEnd:

newrow["topic" = att1.ToString().TrimEnd(new Char[]{'\r'});

Отказ от ответственности: я не программист C #; второе утверждение может быть синтаксически неверным

1
12.12.2008 06:23:48
Это работает ... и я также использую string.ToString (). Replace ("\ r", ""). Единственная проблема заключается в том, что я могу dblclick элемент в DataGridView и редактировать его, и если я ввожу возврат каретки, он возвращается, когда я возвращаюсь в DataGridView. <вздох>
adeena 12.12.2008 16:05:22

Это не имеет отношения к UTF-8 или кодировкам символов - эта проблема связана с окончаниями строк . В Windows каждая строка текстового файла заканчивается двумя символами возврата каретки (CR) и новой строки (LF, для перевода строки), которые представляют собой кодовые точки U + 000D и U + 000A соответственно. В ASCII и UTF-8 они кодируются как два байта 0D 0A. С другой стороны, большинство систем, отличных от Windows, включая Linux и Mac OS X, используют только символ новой строки для обозначения конца строки, поэтому при переносе текстовых файлов между Windows и не-Windows нередко возникают проблемы с окончанием строки. системы.

Однако, поскольку вы используете только Windows в обеих системах, это больше загадка. Одно приложение правильно интерпретирует комбинацию CRLF как новую строку, но другое приложение смущает CR. Возвраты каретки не являются печатными символами, поэтому он заменяет CR на заполнитель, который вы видите; тогда он правильно интерпретирует перевод строки как конец строки.

4
11.12.2008 01:01:39
Я точно понимаю, что вы говорите ... просто не знаю, как выяснить, что отличается между моими двумя компьютерами и что я должен делать, чтобы каждый компьютер правильно их интерпретировал.
adeena 11.12.2008 01:06:18
Если при передаче файла возникает проблема, вы должны увидеть изменения (например, изменения в размере файла, различные контрольные суммы MD5, различия при просмотре с помощью шестнадцатеричного средства просмотра / редактирования).
mweerden 11.12.2008 01:27:12

Квадрат обычно появляется, когда вы используете различные типы новых строк.

  • Linux - (0A)LF
  • Win - (0D0A)CRLF
  • Mac - (0D)CR

Приложение, вероятно, было создано с использованием одного типа, а работающее приложение ожидает другого.


Проверять, выписываться Environment.NewLine

И вы можете попробовать это: (без гарантий - я не пишу много на C #)

strInput = Regex.Replace(strInput, "\\r?\\n?", Environment.NewLine)
2
11.12.2008 01:23:26
Сожалею. Это только «самые распространенные» - они не обязательны. Таким образом, они все еще могут быть смешаны / переключены при сохранении.
Jonathan Lonowski 11.12.2008 01:18:58
Согласен. XML был создан с различной защитой от побега. \ r \ n по умолчанию для Windows. Например, Linux использует только \ n ...
Igor Zelaya 11.12.2008 01:30:41

@ Адам: Извините! Пропустил ваше предыдущее заявление.

Чтобы загрузить документ в программу и отобразить в DataGridView, я сейчас делаю (я говорю «в настоящее время», потому что я пробовал другие вещи, такие как использование XDocument вместо Xelement):

XElement xe1 = XElement.Load(filePath);

DataTable myTable = new DataTable();
myTable = mkTable();   // calls a function that makes the table
var _categories = (from p1 in xe1.Descendants("category") select p1);
int numCat = _categories.Count();
int i = 0;

while (i < numCat)
{
    DataRow newrow;
    newrow = myTable.NewRow();

    if (_categories.ElementAt(i).Parent.Name == "topic")
    {
        string att1 = _categories.ElementAt(i).Parent.Attribute("name").Value.ToString();
        newrow["topic"] = att1.ToString();
    }
    // repeat the above for the different things in my document
    myTable.Rows.Add(newrow);

    i++;
}
myDataSet.Merge(myTable);
bindingSourceIn.DataSource = myDataSet;
myDataGridView.DataSource = bindingSourceIn;
myDataGridView.DataMember = "xmlthing";

(очевидно, здесь все немного сокращено ... т.е. мой bindingsource / datagridview и т. д. объявлен в другом месте ... но, надеюсь, этого достаточно, чтобы иметь смысл)

-Adeena

0
11.12.2008 23:45:05