摘自幫助文檔,我也不是很理解

成都創(chuàng)新互聯(lián)公司公司2013年成立,先為梨樹等服務建站,梨樹等地企業(yè),進行企業(yè)商務咨詢服務。為梨樹企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。
估計只有在Visual Basic 文件輸入和輸出才有用
示例
Visual Basic 復制代碼
Structure Person
Public ID As Integer
Public MonthlySalary As Decimal
Public LastReviewDate As Long
VBFixedString(15) Public FirstName As String
VBFixedString(15) Public LastName As String
VBFixedString(15) Public Title As String
VBFixedString(150) Public ReviewComments As String
End Structure
注意
VBFixedStringAttribute 是信息性的屬性,不能用于將可變長度字符串轉換為固定長度字符串。此屬性的作用是修改那些識別 VBFixedStringAttribute 的方法或 API 調用(如 Len 和 FilePut 函數(shù))使用結構中的字符串以及非局部變量的方式。請記住,此屬性不會更改字符串本身的實際長度。
備注
默認情況下,Visual Basic 字符串為可變長度的字符串。在使用 Visual Basic 文件輸入和輸出函數(shù)(如需要固定長度字符串的 FileGet 和 FilePut)時,該屬性非常有用。
注意
VBFixedStringAttribute 屬性以字節(jié)而不是字符為單位指定字符串長度。
→
上面思路是正確的, 用ascw 函數(shù)也可以
private function LenC( ps as string ) as Integer
Dim n As Integer
Dim StrLen As Integer
For n = 1 To Len(Text1.Text)
If Ascw(Mid(Text1.Text, n, 1)) 256 Then
StrLen = StrLen + 2
Else
StrLen = StrLen + 1
Next n
return strLen
end function
Public?Class?Form1
Dim?b()?As?Byte
Private?Sub?Button1_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?Button1.Click
b?=?System.Text.Encoding.Default.GetBytes(TextBox1.Text)
For?i?=?0?To?UBound(b)
TextBox2.AppendText(i.ToString??"?")
Next
End?Sub
Private?Sub?Button2_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?Button2.Click
TextBox1.Text?=?System.Text.Encoding.Default.GetString(b)
End?Sub
Private?Sub?Form1_Load(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?MyBase.Load
TextBox1.Text?=?"Google?free?online?translation?service?instantly?translates?text?and?web?pages。?該翻譯器支持:?中文(簡體),?中文(繁體),?shqip,?日本語,?русский,?langue?fran?aise?..."
End?Sub
End?ClassVB.Net中用String類型表示字符串,內(nèi)部采用Unicode編碼。當需要在網(wǎng)絡或串口中收發(fā)字符串時,就需要在String和Byte數(shù)組之間進行轉換,這項功能可以通過System.Text.Encoding類實現(xiàn)。
Private zeroChars()?As Char?=?{ChrW(0)}
Dim descBytes()?As Byte?=?System.Text.Encoding.Unicode.GetBytes(mDescription)
Dim?description As?String?=?System.Text.Encoding.Unicode.GetString(rBuffer,?offset,?length).TrimEnd(zeroChars)
說明:C語言中用'\0'表示字符串結束,而String類型中0是有效字符,顯示時是空白字符,會占用顯示寬度,可以用TrimEnd方法將字符串末尾的零字符去掉。
主要敘說一下StrConv 函數(shù)conversion參數(shù)最后兩個值的含義和用途,并舉例說明。
1、語法
StrConv(string, conversion, LCID)
StrConv 函數(shù)的語法有下面的命名參數(shù):
部分 說明
string 必要參數(shù)。要轉換的字符串表達式。
conversion 必要參數(shù)。Integer。其值的和決定轉換的類型。
LCID 可選的。如果與系統(tǒng)LocaleID不同,則為LocaleID(系統(tǒng)LocaleID為缺省值。)
設置值
conversion 參數(shù)的設置值為:
常數(shù) 值 說明
vbUpperCase 1 將字符串文字轉成大寫。
vbLowerCase 2 將字符串文字轉成小寫。
vbProperCase 3 將字符串中每個字的開頭字母轉成大寫。
vbWide* 4* 將字符串中單字節(jié)字符轉成雙字節(jié)字符。
vbNarrow* 8* 將字符串中雙字節(jié)字符轉成單字節(jié)字符。
vbKatakana** 16** 將字符串中平假名字符轉成片假名字符。
vbHiragana** 32** 將字符串中片假名字符轉成平假名字符。
vbUnicode 64 根據(jù)系統(tǒng)的缺省碼頁將字符串轉成 Unicode。
vbFromUnicode 128 將字符串由 Unicode 轉成系統(tǒng)的缺省碼頁。
*應用到遠東國別。
**僅應用到日本。
說明:前面3個參數(shù)比較簡單,后面4個我們用不上,就不說了,主要說說后面兩個。
2、ANSI 格式
語法中說的缺省碼頁就是ANSI模式,英文環(huán)境下 的ANSI 格式其實也就是ASCII碼,其它環(huán)境就不一樣了,比如中文環(huán)境,就是ASCII,一個字節(jié)表示一個字符,GB2312,2個字節(jié)表示一個漢字,所以中文環(huán)境下的ANSI格式就是ASCII碼+GB2312,早期的DOS系統(tǒng)中純文本就是這種格式,這種格式下,通過最高位來判斷是中文字符(最高位是1)還是ASCII字符(最高位是0)。中文環(huán)境下保存文本文件時一般都采用ANSI格式,不過也有其他格式,比如UTF-8。
3、Unicode編碼
Unicode(統(tǒng)一碼、萬國碼、單一碼)是一種在計算機上使用的字符編碼。Unicode 是為了解決傳統(tǒng)的字符編碼方案的局限而產(chǎn)生的,它為每種語言中的每個字符設定了統(tǒng)一并且唯一的二進制編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求。Unicode用兩個字節(jié)表示一個字符,涵蓋了世界上所有字符,和以前的字符集都不兼容,VB內(nèi)部字符串就是采用Unicode編碼,所以當我們打開一個文本文件讀入數(shù)據(jù)的時候,其內(nèi)存中的內(nèi)容和文本文件的內(nèi)容是不一樣的,經(jīng)過了轉換,除非你采用二進制方式讀入。
4、vbUnicode和vbFromUnicode含義
有了上面敘說,這兩個參數(shù)的含義就好理解了,就是Unicode編碼和ANSI編碼的互換,例如:
? ? ? textline= StrConv(plaintext,vbUnicode) ?
這兒textline是以字符串變量,plaintext是以字節(jié)變量保存著ANSI模式的字符內(nèi)容,例如,“2”這個字符,一個字節(jié),值是50,16進制是32,“皖”這個漢字,兩個字節(jié),值是205和238,同樣是這兩個字符,作為字符串在內(nèi)存中都是兩個字節(jié),例如,“2”這個字符在內(nèi)存中16進制值是0032。當VB打開一個文件讀取文本內(nèi)容是,實際上自動進行了上述轉換。
? ? ?plaintext?= StrConv(textline,?vbFromUnicode)
這兒進行相反的轉換,就是將Unicode字符串轉換成ANSI模式,轉換結果必須以字節(jié)方式保存。
5、vbUnicode和vbFromUnicode用途
由于字符在內(nèi)存中的內(nèi)容和文件中的內(nèi)容不一致,所以必須要用到這種轉換,特別是系統(tǒng)間進行數(shù)據(jù)交換、數(shù)據(jù)加密和解密,如果不做轉換可能導致得不到正確的結果。
比如,我們對一個文本文件進行加密,這個文件是ANSI格式存儲的,當從文件內(nèi)容讀入一行到內(nèi)存的時候,自動將內(nèi)容轉換成了Unicode格式,如果這時候對其做加密運算,其結果和文件中字符串加密結果是不一樣的,這樣的結果如果讓別人解密將無法得到正確的結果。如果對讀入內(nèi)存的內(nèi)容先做個轉換(textline是讀入內(nèi)容):
? ? ?plaintext?= StrConv(textline,?vbFromUnicode)
再對plaintext做加密,其結果就一樣了。
舉例(按行做加密和解密運算,算法是AES+Base64):
[vb]?view plain?copy
Status?=?"Encrypting?File"
Open?FileName?For?Input?As?#1??????'?打開輸入文件。
Open?FileName2?For?Output?As?#2?????'?打開輸出文件。
Do?While?Not?EOF(1)
Line?Input?#1,?TextLine
plaintext?=?StrConv(TextLine,?vbFromUnicode)
Status?=?"Encrypting?Data"
m_Rijndael.SetCipherKey?pass,?KeyBits
m_Rijndael.ArrayEncrypt?plaintext,?ciphertext,?0
Status?=?"Converting?Text?to?Base64"
TextLine?=?Base64Encode(ciphertext)
Status?=?""
Print?#2,?TextLine????'?將字符串寫入文件。
Loop
Close
[vb]?view plain?copy
Status?=?"Decrypting?File"
Open?FileName?For?Input?As?#1??????'?打開輸入文件。
Open?FileName2?For?Output?As?#2????'?打開輸出文件。
Do?While?Not?EOF(1)
Line?Input?#1,?TextLine
Status?=?"Converting?Base64?to?Text"
ciphertext?=?Base64Decode(TextLine)
Status?=?"Decrypting?Data"
m_Rijndael.SetCipherKey?pass,?KeyBits
If?m_Rijndael.ArrayDecrypt(plaintext,?ciphertext,?0)??0?Then
Status?=?""
Exit?Sub
End?If
TextLine?=?StrConv(plaintext,?vbUnicode)
For?i?=?0?To?UBound(plaintext)
Debug.Print?plaintext(i)
Next?i
k?=?InStr(1,?TextLine,?Chr(0),?vbBinaryCompare)
If?k??0?Then?TextLine?=?Left(TextLine,?k?-?1)????'截掉加密時補的0
MsgBox?TextLine??"end"
Status?=?""
Print?#2,?TextLine????'?將字符串寫入文件。
Loop
Close
沒有這種函數(shù),自己做一個函數(shù),效率不會低,因為都是簡單運算:
Function FillString(ByVal a As String, ByVal b As String, ByVal c As Integer) As String
If a.Length c Then
Return a + StrDup(c - a.Length, b)
Else
Return Mid(a, 1, c)
End If
End Function
遍歷每一個字符,看是全角還是半角的。半角的字符總數(shù) +1,全角的字符總數(shù) +2。
參考:
Public?Function?GetByteLength(ByVal?value?As?String)?As?Long
Dim?i?As?Long?=?0
For?Each?c?As?Char?In?value
If?(c.ToString().Length?=?System.Text.Encoding.Default.GetByteCount(value.ToString()))?Then
i?=?i?+?1
End?If
i?=?i?+?1
Next
Return?i
End?Function
本文題目:vb.net字符串寬度,vb中字符串比較大小
本文來源:http://chinadenli.net/article3/dsiojis.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、品牌網(wǎng)站設計、自適應網(wǎng)站、面包屑導航、動態(tài)網(wǎng)站、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)