我有两台电脑。两者都在运行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
答案 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)
当您使用不同类型的换行符时,通常会出现方块。
(0A)
LF (0D0A)
CRLF (0D)
CR 该应用程序可能是使用1种类型创建的,正在运行的应用程序期待另一种类型。
并且,您可以尝试这样:(不保证 - 我不会写很多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