Я думаю, что это какая-то проблема кодирования - PullRequest
0 голосов
/ 11 декабря 2008

У меня есть два компьютера. Оба работают под управлением 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

Ответы [ 4 ]

4 голосов
/ 11 декабря 2008

Это не имеет отношения к 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 на заполнитель, который вы видите; затем он правильно интерпретирует перевод строки как конец строки.

2 голосов
/ 11 декабря 2008

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

  • Linux - (0A) LF
  • Победа - (0D0A) CRLF
  • Mac - (0D) CR

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


Выезд Environment.NewLine

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

strInput = Regex.Replace(strInput, "\\r?\\n?", Environment.NewLine)
1 голос
/ 12 декабря 2008

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

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

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

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

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

0 голосов
/ 12 декабря 2008

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

Чтобы загрузить документ в программу и отобразить в 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

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