0

我有两台电脑。两者都运行 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。然后我将这个新文件读回到我的程序中。我得到相同的结果。

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

-阿迪娜

4

4 回答 4

4

这与 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,这就是你所看到的;然后它正确地将换行解释为行尾。

于 2008-12-11T01:01:39.923 回答
2

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

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

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


查看Environment.NewLine

而且,你可以试试这个:(不保证——我写的 C# 不多)

strInput = Regex.Replace(strInput, "\\r?\\n?", Environment.NewLine)
于 2008-12-11T01:02:08.987 回答
1

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

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

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

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

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

于 2008-12-12T06:23:48.400 回答
0

//@亚当:对不起!错过了你之前的陈述。

要将文档加载到程序中并在 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 等在其他地方声明......但希望这足以有意义)

-阿迪娜

于 2008-12-11T23:45:05.163 回答