我认为这是某种编码问题

时间:2008-12-11 00:53:05

标签: c# xml encoding datagridview

我有两台电脑。两者都在运行WinXP SP2(我真的不知道他们的相似之处)。我正在运行两个MS Visual C#2008快速版本,这就是我目前正在使用的程序。

我创建了一个加载XML文件的应用程序,并在DataGridView中显示内容。

我的xml文件的第一行是:

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

......真的......它是utf-8(至少根据MS VS C#,当我在那里打开文件时)。

我编译代码并在一台计算机上运行它,我的DataGridView的内容显示正常。没有有趣的人物。我编译代码并在另一台计算机上运行它(或者只是从计算机#1获取已发布的版本并将其安装在计算机#2上 - 我尝试了这两种方式)并在datagridview中,其中有换行符/换行符在xml文件中,我看到了有趣的方形字符。

我是编码的新手...所以我真正尝试解决的唯一问题是使用相同的程序将我的xml内容写入一个新的xml文件(但我实际上是将它写入一个文本文件,其中包含xml标记)因为默认写入文本文件似乎是utf-8。然后我把这个新文件读回我的程序。我得到了相同的结果。

我不知道还有什么可做或者如何解决这个问题,或者我可能从根本上做错了什么。

-Adeena

4 个答案:

答案 0 :(得分:4)

这与UTF-8或字符编码无关 - 此问题与line endings有关。在Windows中,文本文件的每一行以两个字符回车(CR)和换行符(LF,用于换行)结束,它们分别是代码点U + 000D和U + 000A。在ASCII和UTF-8中,这些编码为两个字节0D 0A。另一方面,大多数非Windows系统(包括Linux和Mac OS X)仅使用换行符来表示行尾,因此在Windows和非Windows之间传输文本文件时看到行结束问题并不罕见系统

但是,由于你在两个系统上只使用Windows,这更是一个谜。一个应用程序正确地将CRLF组合解释为换行符,但另一个应用程序被CR混淆。回车符不是可打印字符,因此它用占位符框替换CR,这就是您所看到的;然后它正确地将换行符解释为行尾。

答案 1 :(得分:2)

当您使用不同类型的换行符时,通常会出现方块。

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

该应用程序可能是使用1种类型创建的,正在运行的应用程序期待另一种类型。


查看Environment.NewLine

并且,您可以尝试这样:(不保证 - 我不会写很多C#)

strInput = Regex.Replace(strInput, "\\r?\\n?", Environment.NewLine)

答案 2 :(得分:1)

我不确定你的问题的原因,但一个解决方案是从你的字符串中删除回车。对于您添加的每个字符串,只需在其上调用TrimEnd(null)即可删除尾随空格:

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

如果您的字符串可能以其他空格(即空格或制表符)结尾,并且您想保留它们,那么只需将仅包含回车符的数组传递给TrimEnd

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

免责声明:我不是C#程序员;第二个语句可能在语法上不正确

答案 3 :(得分:0)

@ Adam: 抱歉!错过了你早先的陈述。

要将文档加载到程序中并显示在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