質問
CSVファイルから文字列値が読み取られています。 CSVファイルには7が含まれています NULL
バイト、私はそれを16進エディタで開くことでこれを確認しました、そして、十分に十分な7があると確信しています 0x0
そこにバイト。このひもは私に痛みを引き起こしています。
私がチェックするときにvb.netで strlen
この文字列の値は7の値を返し、私がする場合 String.IsNullOrWhitespace
それは戻ってきます false
.
なぜそうなのか理解できませんか?文字列をバイト配列に分割し、各バイトは 0x0
, 、これはnull/Nothingです。 a string = Nothing
比較も失敗します。
この文字列を自分の文字列に置き換えることができますが、動的にはできません。この文字列が各バイトがいても7の長さを返す理由 0x0
?
解決
ヌル文字は空白ではなく、文字列の参照は何もないので、私は期待します String.IsNullOrWhitespace()
falseを返す
他のヒント
残念ながら null
キャラクター7回は、空の文字列やヌル文字列ではありません。 .NETで覚えておいてください文字列はあるレベルにあります ポインター キャラクター配列に。このポインターがnullに設定されている場合、文字列は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);
isnullemptyorwhitespaceは、変数自体がnullであるかどうかをチェックしますが、文字列にnull文字が含まれている場合ではありません。ヌル文字は空白ではありません。したがって、このチェックも失敗します。
テスト後、トリム()を使用することをお勧めします。 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
キャラクターコードゼロを持つキャラクターは、他のキャラクターと同じようにキャラクターです。このような文字が7つある文字列がある場合、長さは7つです。 NUL文字は白い空間文字ではなく、nul文字を含む文字列は、null(何もない)の文字列参照と同じではありません。
使用できます Trim
方法(または TrimEnd
)nul文字をトリミングする必要があることを指定してnul文字を削除するには: str = str.Trim(Chr(0))
, 、しかし、私はむしろ、最初から文字列にnul文字がある理由を自問するべきだと思います。
ファイルからデータを適切に読んでいますか?一般的なエラーは、を使用することです Read
ストリームから読み取る方法ですが、それは返品値であるため、ストリームからのデータが部分的に満たされたバッファで終了することを無視します。あなたがそれを作成するとき、バイト配列はゼロで満たされているため、バイトはによって設定されていません Read
データを文字列にデコードすると、操作はゼロのままで、NUL文字になります。
- a ヌル 文字列は、初期化されていない、またはに設定されているものです
Nothing
. - an 空 文字列は、空の文字列を含むものです
String.Empty
また""
. - Whitespace文字は、スペース、タブ、Newline、キャリッジリターン、そして さらに多く. 。しかし、ヌル文字ではありません。
- あなたの文字列は空でもありません
Nothing
. 。 7文字が含まれており、それぞれがヌル文字であるため、空白ではありません。
使用できます string.replace ゼロ文字を削除するには?このようなもの
s = s.Replace(vbNullChar, "")
エンコードの問題に遭遇したに違いない。ファイルをUTF-16として読んでみてください