4

CSVファイルから文字列値を読み込んでいます。CSVファイルには7NULLバイトが含まれています。これは、16進エディターで開いて確認しましたが、70x0バイトあることを確認してください。このひもは私に痛みを引き起こしています。

vb.netではstrlen、この文字列のをチェックすると7の値が返され、チェックするString.IsNullOrWhitespaceと。が返されますfalse

なぜなのかわかりませんか?文字列をバイト配列に分割しました。各バイトは0x0、null/nothingです。string = Nothing比較も失敗します。

この文字列を自分の文字列に置き換えたいのですが、動的にこれを行うことはできません。各バイトが7であるにもかかわらず、この文字列が7の長さを返す理由についての提案はあり0x0ますか?

4

6 に答える 6

4

残念ながら、null7回の文字は、空の文字列でもnull文字列でもありません。.NETでは、文字列はあるレベルでは文字配列へのポインタであることを忘れないでください。このポインタがnullに設定されている場合、文字列はnullになります。ポインタが長さゼロの配列を指している場合、文字列は空です。この場合、ポインターはヌル文字の長さ7の配列を指します(バイトはすべてゼロです)。

ヌル文字列

A->

空の文字列

A->()

あなたの文字列

A->((0)(0)(0)(0)(0)(0)(0))

を使用して、このヌル文字をテストできます

char nullChar = char.ConvertFromUtf32(0);
string nullCharString = new String(nullChar);
bool hasNullChar = A.Contains(nullCharString);
于 2010-06-29T12:15:44.020 に答える
3

String.IsNullOrWhitespace()ヌル文字は空白ではなく、文字列参照はNothingではないため、 falseを返すと予想されます

于 2010-06-29T12:08:48.940 に答える
2

文字コードがゼロの文字は、他の文字と同じです。そのような文字が7つある文字列がある場合、長さは7です。NUL文字は空白文字ではなく、NUL文字を含む文字列は、null(なし)の文字列参照と同じではありません。

Trimメソッド(または)を使用しTrimEndて、NUL文字をトリミングするように指定することでNUL文字を削除できstr = str.Trim(Chr(0))ますが、文字列にNUL文字が含まれている理由を自問する必要があると思います。

ファイルからデータを正しく読み取っていますか?一般的なエラーは、Readメソッドを使用してストリームから読み取ることですが、その戻り値を無視するため、ストリームからのデータで部分的にのみ満たされたバッファーになってしまいます。バイト配列は作成時にゼロで埋められるため、Read操作で設定されていないバイトはゼロのままで、データを文字列にデコードするとNUL文字になります。

于 2010-06-29T12:15:58.920 に答える
1

IsNullEmptyOrWhitespaceは、文字列にNULL文字が含まれているかどうかではなく、変数自体がnullかどうかをチェックします。NULL文字は空白ではありません。したがって、このチェックも失敗します。

テスト後、Trim()を使用することをお勧めします。C#では、これは次のようになります。

bool MyNullCheck(string s) {
    if (s == null) return false;
    s = s.Trim(new string(char.ConvertFromUtf32(0), 1));
    return string.IsNullEmptyOrWhiteSpace(s);
}

VBに変換してみてください(チェックされていません)

Function MyNullCheck(s as String) as Boolean
  If s Is Nothing Then
     Return False
  End If
  s = s.Trim(New String(vbNullChar, 1))
  Return String.IsNullEmptyOrWhiteSpace(s)
End Function
于 2010-06-29T12:15:16.367 に答える
0
  • null文字列は、初期化されていないか、に設定されている文字列ですNothing
  • の文字列は、空の文字列String.Emptyまたはを含む文字列""です。
  • 空白文字は、スペース、タブ、改行、キャリッジリターンなどです。しかし、ヌル文字ではありません。
  • 文字列は空でも。でもありませんNothing。これには7文字が含まれ、それぞれがヌル文字であるため、空白ではありません。

String.Replaceを使用してゼロ文字を削除できますか?このようなもの

s = s.Replace(vbNullChar, "")
于 2010-06-29T12:16:04.273 に答える
0

エンコーディングの問題が発生したに違いありません。ファイルをUTF-16として読み取ってみてください

于 2010-06-29T12:18:51.373 に答える