2008-12-11 64 views
0

我有兩臺電腦。兩個運行WinXP SP2(我真的不知道類似他們超越)。我正在運行MS Visual C#2008快速版,這就是我目前使用的編程。我覺得這是某種編碼問題

我做了一個應用程序,加載在一個XML文件中,並顯示在DataGridView中的內容。

我的XML文件的第一行是:

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

...真的...這(至少根據MS VS C#,當我剛剛打開該文件存在)是UTF-8。

我編譯代碼並在一臺計算機上運行它,並且我的DataGridView的內容顯示正常。沒有有趣的人物。我編譯代碼並在另一臺計算機上運行它(或者從計算機#1中獲取發佈的版本並將其安裝到計算機#2上 - 我試過這兩種方法),並在datagridview中,在其中有換行符/新行XML文件,我看到有趣的方形字符。

我是編碼的新手......所以我真正嘗試排除故障的唯一方法是使用相同的程序將我的xml的內容寫入新的xml文件(但我實際上是將它寫入一個文本文件,其中帶有xml標籤),因爲默認寫入文本文件似乎是utf-8。然後我將這個新文件讀回到我的程序中。我得到相同的結果。

我不知道還有什麼辦法或如何解決這個問題,或者我可能從根本上做錯了什麼。

-Adeena

+0

我會檢查看看2臺計算機有多相似,因爲我認爲問題與讀取文件中被解釋不同的「特殊」字符有關。兩臺計算機是否安裝了相同版本的.Net框架?兩臺計算機是否具有相同的語言設置? – 2008-12-11 21:40:16

回答

1

我不知道原因你的問題,但一個解決方案是以便從您的字符串中刪除回車。對於添加的每個字符串,只需調用它TrimEnd(null)刪除尾隨空白:

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

如果你的字符串可能會在其他的空格結束(即空格或製表符),你想保持這些,那麼就傳遞包含數組只有回車符TrimEnd

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

免責聲明:我不是一個C#程序員;第二個陳述可能在語法上不正確

4

這沒有使用UTF-8或字符編碼做的事情 - 這個問題與line endings做。在Windows中,文本文件的每一行都以兩個字符結尾,分別是代碼點U + 000D和U + 000A,兩個字符分別爲回車符(CR)和換行符(換行符爲換行符)。在ASCII和UTF-8中,這些編碼爲兩個字節0D 0A。另一方面,大多數非Windows系統(包括Linux和Mac OS X)僅使用換行符來表示換行符,因此在Windows和非Windows之間傳輸文本文件時發現行結束問題並不罕見系統。

但是,由於您在兩個系統上只使用Windows,所以這更加神祕。一個應用程序正確地將CRLF組合解釋爲換行符,但另一個應用程序被CR所困惑。回車符不是可打印的字符,所以它用一個佔位符框代替了CR,這就是你所看到的;它然後正確地將換行解釋爲行尾。

+0

我完全理解你在說什麼......只是不知道如何弄清楚我的兩臺計算機之間有什麼不同,以及我應該如何確保每臺計算機正確解釋它。 – adeena 2008-12-11 01:06:18

+0

如果傳輸文件導致問題,您應該能夠看到更改(例如,文件大小的變化,不同的MD5校驗和,使用十六進制查看器/編輯器查看時的差異)。 – mweerden 2008-12-11 01:27:12

2

當您使用不同類型的換行符時,通常會顯示正方形。

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

的應用程序,使用1分型可能創建並運行應用程序是期待另一個。


退房Environment.NewLine

而且,你可以試試這個:(無擔保 - 我不寫太多C#)

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

但他們都是贏機...? – adeena 2008-12-11 01:07:08

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的等在別處聲明....但希望這是足以讓感)

-Adeena

相關問題