2012-11-27 16 views
4

我有一個簡單的問題:vb.net如何確定字符串長度並處理字符串的終止?
我知道在C(及其家族)空字符是字符串的結尾。在vb6中,null字符對字符串的終止沒有影響,但在vb.net中它似乎有霧!
在VB6假定這段代碼:vb.net中嵌入null的字符串長度

Private Sub Command1_Click() 
Dim Str As String 
Str = "Death is a good user," & Chr(0) & " Yes I'm good" 
RichTextBox1.Text = Str 
RichTextBox1.Text = RichTextBox1.Text & vbNewLine & Len(Str) 
End Sub 

這種運行此代碼時會發生什麼: enter image description here

而且這是正常的。這是C類似的代碼:

#include "stdafx.h" 
#include <string.h> 
int main(int argc, char* argv[]) 
{ 
    char *p="Death is a good user,\0 Yes I'm good"; 

    printf("String:%s\nString length:%d\n",p,strlen(p)); 

    return 0; 
} 

這是發生了什麼:
enter image description here

這很好得根據C規則,但這裏是在vb.net相同的代碼:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Dim str As String = "Death is a good user," & Chr(0) & " Yes I'm good" 
    RichTextBox1.Text = str 
    RichTextBox1.Text &= vbNewLine & str.Length 
End Sub 

發生了什麼:
enter image description here


這似乎並不正確!

編輯1:寫入文件似乎是正確的:

enter image description here

編輯2Marktcarvin暗示,它可能是UI的問題,但它並不能解釋爲什麼VB6節目整串!

編輯3:我知道Windows和它的API,UI,......都寫在C,所以這將是正常的,他們喜歡C反應,但正如我上面顯示,他們不這樣做。

+0

如果將字符串寫入文件會發生什麼? –

+0

相關:http://stackoverflow.com/questions/178751/getting-the-whole-output-of-a-string-that-c​​ontains-chr0 –

+0

@JoelCoehoorn查看編輯! – undone

回答

3

存在由底層運行支持庫中的片段用3種不同的字符串類型:

  • BSTR,由VB6使用。它是一種COM自動化類型,由所有可以存儲Unicode字符串幷包含明確長度的ActiveX控件使用。 BSTR因此可以存儲嵌入的零。
  • 由C語言使用的C字符串。沒有顯式長度存儲,零表示字符串結束。 winapi基於C語言,在其功能中使用C字符串。
  • System.String,.NET字符串類型,用於任何.NET代碼。與BSTR類似,它也有一個明確的長度字段,因此可以存儲帶有嵌入零的字符串。

在這三種情況下的互操作需要由底層運行支持庫被用來使字符串可見:

  • VB6使用的RichEditBox的ActiveX控件。究竟是什麼控件看起來很難猜測,它非常特定於VB6並命名爲richtx32.ocx。它也使用本地Windows RichEdit控件(riched32.dll),因此ActiveX控件非常充當包裝器,使本機Windows控件在VB6應用程序中可用。您已經確定地證明它支持BSTR的行爲並處理嵌入的零,就像任何ActiveX控件應該一樣。

  • C程序使用C運行時庫,它通過調用winapi控制檯函數WriteConsole()來實現printf()。這個api函數是基於C的,但是buck已經在printf()處停下來了,嵌入的零是該函數的字符串終止符。這裏沒有驚喜。

  • Winforms程序使用.NET RichEditBox類,這是riched20.dll本地Windows控件的託管包裝。底層的機制是串聯的,類的幾乎所有屬性和方法都是通過禁止SendMessage()來發送像EM_SETTEXTEX這樣的消息來實現的,該消息改變了控件所顯示的文本。這也是一個基於C的api,一個零就像一個字符串終結符。與richtx32.ocx包裝不同,.NET RichEditBox包裝類而不是努力正確處理帶嵌入零的字符串。它只是簡單地傳遞字符串,並將其留給編譯器來將.NET字符串轉換爲C字符串。由於C字符串沒有長度字段,因此沒有其他選項可以截斷零處的字符串。

9

在VB.NET(和C#)中,字符串的處理方式與它們在VB6中的方式非常相似,也就是說它們的顯式長度不基於任何特定字符或字符。

至於RichTextBox,它只會顯示它不支持嵌入的空字符。

+0

我試圖用標籤,msgbox和...顯示'str',並且都是這樣!我不認爲這是RichTextBox的問題! – undone

+1

是的,字符串變量很好。這裏的視覺控件很奇怪。如果將字符串寫入文件會發生什麼? –

+1

同意,這是不喜歡它的用戶界面。一個字符串只是一個字符數組,它並不關心那些字符中的內容。 – tcarvin