0

私は 2 台のコンピューターを持っています。どちらも WinXP SP2 を実行しています (それ以上の類似点についてはよくわかりません)。私は両方で MS Visual C# 2008 Express Edition を実行しており、それが現在プログラムに使用しているものです。

XML ファイルを読み込んで内容を DataGridView に表示するアプリケーションを作成しました。

私のxmlファイルの最初の行は次のとおりです。

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

...そして本当に...それはutf-8です(少なくともMS VS C#によると、そこでファイルを開くだけです)。

コードをコンパイルして 1 台のコンピューターで実行すると、DataGridView の内容は正常に表示されます。面白い文字はありません。私はコードをコンパイルし、他のコンピューターで実行します (または、コンピューター #1 から公開されたバージョンを取得してコンピューター #2 にインストールします - 私はこれを両方の方法で試しました)、改行/改行がある datagridview で実行します。 xml ファイルを見ると、おかしな四角形の文字が表示されます。

私はエンコーディングの初心者です...そのため、実際にトラブルシューティングを試みたのは、同じプログラムを使用してxmlの内容を新しいxmlファイルに書き込むことだけでした(ただし、実際にはテキストファイルに書き込んでいます.テキストファイルへのデフォルトの書き込みはutf-8のようです. 次に、この新しいファイルをプログラムに読み込みます。同じ結果が得られます。

他に何をすべきか、これをトラブルシューティングする方法、またはそもそも何が根本的に間違っているのかわかりません。

-アディーナ

4

4 に答える 4

4

これは UTF-8 や文字エンコーディングとは関係ありません。この問題は行末に関係しています。Windows では、テキスト ファイルの各行は、それぞれコード ポイント U+000D と U+000A である 2 文字のキャリッジ リターン (CR) と改行 (改行の LF) で終わります。ASCII および UTF-8 では、これらは 2 バイトとしてエンコードされます0D 0A。一方、Linux や Mac OS X を含む Windows 以外のほとんどのシステムでは、改行文字だけを使用して行末を示すため、Windows と Windows 以外の間でテキスト ファイルを転送するときに行末の問題が発生することは珍しくありません。システム。

ただし、両方のシステムで Windows のみを使用しているため、これは謎です。1 つのアプリケーションは CRLF の組み合わせを改行として正しく解釈していますが、他のアプリケーションは CR によって混乱しています。キャリッジ リターンは印刷可能な文字ではないため、CR がプレースホルダー ボックスに置き換えられます。これが表示されます。次に、改行を行末として正しく解釈します。

于 2008-12-11T01:01:39.923 に答える
2

通常、さまざまな種類の改行を使用すると、四角形が表示されます。

  • Linux- (0A)LF
  • 勝利 - (0D0A)CRLF
  • マック - (0D)CR

アプリはおそらく 1 つの型を使用して作成され、実行中のアプリは別の型を想定しています。


チェックアウトEnvironment.NewLine

そして、あなたはこれを試すかもしれません: (保証はありません -- 私はあまり C# を書きません)

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

問題の原因はわかりませんが、解決策の 1 つは、文字列からキャリッジ リターンを削除することです。追加するすべての文字列に対して、TrimEnd(null)それを呼び出して末尾の空白を削除します。

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

文字列が他の空白 (つまり、スペースまたはタブ) で終わる可能性があり、それらを保持したい場合は、キャリッジ リターン文字のみを含む配列を に渡しますTrimEnd

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

免責事項: 私は C# プログラマーではありません。2 番目のステートメントは構文的に正しくない可能性があります

于 2008-12-12T06:23:48.400 に答える
0

@アダム:ごめんなさい!先程の発言を見逃しました。

ドキュメントをプログラムにロードして DataGridView に表示するために、現在行っています (Xelement の代わりに XDocument を使用するなどの他のことを試したため、「現在」と言います):

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";

(明らかに、ここでは少し省略されています...つまり、私のバインディングソース/データグリッドビューなどは別の場所で宣言されています....しかし、うまくいけば、これは意味をなすのに十分です)

-アディーナ

于 2008-12-11T23:45:05.163 に答える