2010-06-29 127 views
2

我有一個從CSV文件讀入的字符串值。 CSV文件包含7個NULL字節,我已經通過在十六進制編輯器中打開它確認了這一點,並確定存在7個0x0字節。這串讓我很痛苦。VB.NET - 空字符串

在vb.net當我檢查這個字符串的strlen它返回值7,如果我做了String.IsNullOrWhitespace它返回false

我不明白這是爲什麼?我已將字符串拆分爲一個字節數組,每個字節爲0x0,該字符爲空/無。 string = Nothing比較也失敗。

我想能夠用我自己的字符串替換這個字符串,但我不能動態地做到這一點。任何建議爲什麼這個字符串返回長度爲7,即使每個字節是0x0

+0

您的代碼示例會很有幫助。 – 2010-06-29 12:05:22

回答

3

空字符不是空白,並且您的字符串引用不是沒有,所以我希望String.IsNullOrWhitespace()返回false

+0

所以,如果是這樣的話,我該如何檢查一個NULL字符串? – WizardsSleeve 2010-06-29 12:12:36

+0

您需要將它們轉換爲「其他」,例如使用'yourstring = yourstring.Replace(Chr(0),「」c)'將其轉換爲空格或遍歷字符串並檢查自己 – 2010-06-29 12:18:16

1

IsNullEmptyOrWhitespace檢查變量本身爲空,而不是如果字符串包含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 
4

不幸的是null字符七次不是空字符串,或一個空字符串。在.NET中記住一個字符串在某個級別上是一個pointer字符數組。如果此指針設置爲null,則字符串爲null。如果指針指向長度爲零的數組,則字符串爲空。在這種情況下,指針指向長度爲七個空字符數組(該字節全爲零)。

空字符串

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); 
1
測試該空字符

字符代碼爲零的字符與其他字符一樣。如果你有一個有七個這樣的字符的字符串,長度是七。 NUL字符不是空白字符,並且包含NUL字符的字符串與空字符串引用不同(Nothing)。

你可以使用Trim方法(或TrimEnd)通過指定它應該修剪NULL字符刪除NULL字符:str = str.Trim(Chr(0)),但我認爲你應該先問一下自己,爲什麼沒有下手字符串中的NULL字符。

您是否正在從文件中正確讀取數據?一個常見的錯誤是使用Read方法從流中讀取,但忽略它的返回值,從而結束於僅部分充滿流中數據的緩衝區。由於字節數組在創建時填充了零,所以未將Read操作設置的字節保留爲零,並且在將數據解碼爲字符串時將成爲NUL字符。

+0

字符串來自另一個我無法控制的節目輸出。我正在閱讀它,因爲我使用十六進制編輯器驗證了文件的內容。 – WizardsSleeve 2010-06-29 12:18:47

+0

@WizardsSleeve:好的,如果您確定可以安全地忽略NUL字符,那麼您可以從字符串中修剪它們。如果該字符串僅包含NUL字符,那麼最後會得到一個空字符串。 – Guffa 2010-06-29 13:33:59

0
  • 一個字符串是一個尚未初始化或已被設置爲Nothing
  • 字符串是一個包含空字符串String.Empty""
  • 空白字符是空格,製表符,換行符,回車符和lots more。但不是空字符。
  • 您的字符串既不爲空也不是Nothing。它包含7個字符,每個字符都是空字符 - 所以它不是空格。

您可以使用String.Replace刪除零個字符?像這樣的東西

s = s.Replace(vbNullChar, "") 
0

我敢打賭,你已經遇到了一個編碼問題。嘗試將文件讀取爲UTF-16