【问题标题】:I think this is some kind of encoding problem我认为这是某种编码问题
【发布时间】:2008-12-11 00:53:04
【问题描述】:

我有两台电脑。两者都运行 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上 - 我尝试了这两种方式)和datagridview,其中有换行符/换行符xml 文件,我看到了有趣的方形字符。

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

我不知道还能做什么或如何解决此问题,或者我可能首先做错了什么。

-阿迪娜

【问题讨论】:

  • 我会检查两台计算机的相似程度,因为我认为问题与读取文件中解释不同的“特殊”字符有关。两台计算机是否安装了相同版本的 .Net 框架?两台计算机的语言设置是否相同?

标签: c# xml encoding datagridview


【解决方案1】:

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

【讨论】:

  • 我完全理解你在说什么......只是不知道如何弄清楚我的两台计算机之间的不同之处以及我应该做些什么来确保每台计算机都能正确解释它。
  • 如果传输文件导致问题,您应该能够看到更改(例如文件大小的更改、不同的 MD5 校验和、使用十六进制查看器/编辑器查看时的差异)。
【解决方案2】:

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

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

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


查看Environment.NewLine

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

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

【讨论】:

  • 对不起。这些只是“最常见的”——它们不是必需的。因此,它们仍然可以在保存时混合/切换。
  • 我同意。 xml 是用不同的转义序列创建的。 \r\n 是 windows 默认值。例如 Linux 仅使用使用 \n ...
【解决方案3】:

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

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

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

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

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

【讨论】:

  • 它有效...而且我也在使用 string.ToString().Replace("\r","")。唯一的问题是我可以在 DataGridView 中 dblclick 项目并对其进行编辑,如果我输入回车,当我返回 DataGridView 时它会返回。
【解决方案4】:

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

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

-阿迪娜

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    相关资源
    最近更新 更多