永发信息网

VB.NET UNICODE码 显示

答案:2  悬赏:60  手机版
解决时间 2021-03-07 03:24
VB.NET UNICODE码 显示
最佳答案
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类型表示字符串,内部采用Unicode编码。当需要在网络或串口中收发字符串时,就需要在String和Byte数组之间进行转换,这项功能可以通过System.Text.Encoding类实现。

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语言中用''表示字符串结束,而String类型中0是有效字符,显示时是空白字符,会占用显示宽度,可以用TrimEnd方法将字符串末尾的零字符去掉。
主要叙说一下StrConv 函数conversion参数最后两个值的含义和用途,并举例说明。
1、语法
StrConv(string, conversion, LCID)
StrConv 函数的语法有下面的命名参数:
部分 说明
string 必要参数。要转换的字符串表达式。
conversion 必要参数。Integer。其值的和决定转换的类型。
LCID 可选的。如果与系统LocaleID不同,则为LocaleID(系统LocaleID为缺省值。)
设置值
conversion 参数的设置值为:
常数 值 说明
vbUpperCase 1 将字符串文字转成大写。
vbLowerCase 2 将字符串文字转成小写。
vbProperCase 3 将字符串中每个字的开头字母转成大写。
vbWide* 4* 将字符串中单字节字符转成双字节字符。
vbNarrow* 8* 将字符串中双字节字符转成单字节字符。
vbKatakana** 16** 将字符串中平假名字符转成片假名字符。
vbHiragana** 32** 将字符串中片假名字符转成平假名字符。
vbUnicode 64 根据系统的缺省码页将字符串转成 Unicode。
vbFromUnicode 128 将字符串由 Unicode 转成系统的缺省码页。
*应用到远东国别。
**仅应用到日本。
说明:前面3个参数比较简单,后面4个我们用不上,就不说了,主要说说后面两个。


2、ANSI 格式
语法中说的缺省码页就是ANSI模式,英文环境下 的ANSI 格式其实也就是ASCII码,其它环境就不一样了,比如中文环境,就是ASCII,一个字节表示一个字符,GB2312,2个字节表示一个汉字,所以中文环境下的ANSI格式就是ASCII码+GB2312,早期的DOS系统中纯文本就是这种格式,这种格式下,通过最高位来判断是中文字符(最高位是1)还是ASCII字符(最高位是0)。中文环境下保存文本文件时一般都采用ANSI格式,不过也有其他格式,比如UTF-8。
3、Unicode编码
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。Unicode用两个字节表示一个字符,涵盖了世界上所有字符,和以前的字符集都不兼容,VB内部字符串就是采用Unicode编码,所以当我们打开一个文本文件读入数据的时候,其内存中的内容和文本文件的内容是不一样的,经过了转换,除非你采用二进制方式读入。

4、vbUnicode和vbFromUnicode含义
有了上面叙说,这两个参数的含义就好理解了,就是Unicode编码和ANSI编码的互换,例如:
            textline= StrConv(plaintext,vbUnicode)     
这儿textline是以字符串变量,plaintext是以字节变量保存着ANSI模式的字符内容,例如,“2”这个字符,一个字节,值是50,16进制是32,“皖”这个汉字,两个字节,值是205和238,同样是这两个字符,作为字符串在内存中都是两个字节,例如,“2”这个字符在内存中16进制值是0032。当VB打开一个文件读取文本内容是,实际上自动进行了上述转换。
           plaintext = StrConv(textline, vbFromUnicode) 
这儿进行相反的转换,就是将Unicode字符串转换成ANSI模式,转换结果必须以字节方式保存。
5、vbUnicode和vbFromUnicode用途
由于字符在内存中的内容和文件中的内容不一致,所以必须要用到这种转换,特别是系统间进行数据交换、数据加密和解密,如果不做转换可能导致得不到正确的结果。
比如,我们对一个文本文件进行加密,这个文件是ANSI格式存储的,当从文件内容读入一行到内存的时候,自动将内容转换成了Unicode格式,如果这时候对其做加密运算,其结果和文件中字符串加密结果是不一样的,这样的结果如果让别人解密将无法得到正确的结果。如果对读入内存的内容先做个转换(textline是读入内容):
           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  
全部回答
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 Class
追问为什麼像"1"编码 16进位是"0031" 10进位是"0049"阿 而它却显示"49 0" 为啥是倒过来的?追答具体的unicode是怎样编码的就不细究了,只要明白该使用哪些函数可以将字符串转换为字节数组,再可以转换回来就可以了。
顺便说一句:显示倒过来,是因为一个字(WORD)在内存中的排列,是按照“低位在前,高位在后”的原则,你可以查一下相关资料。追问那如果我要用产生乱数产生一串随机10进位的unicode码 要如何用才能用unicode码显示对应的字 中间要如何转换追答大哥,你问题越来越深啦,连分都没有,能不能先采纳了,再开新问题啊?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
孤岛惊魂3主角被瓦阿斯捅后为何没死
除了张店信息港,张店信息网,张店吧之外,淄
川味鱼馆这个地址在什么地方,我要处理点事
一个17的高中生长了一年的痘痘,正常吗?今年
男士能用女士的护肤品吗?
【世说新语咏雪】《世说新语》中《咏雪》的两
你好,我在泰国皇家珠宝中心买了一个翡翠手镯
常吃酸奶对身体的好处与坏处?
和电动车发生车祸对方受伤,对方没保险协商我
沈阳市有几家面粉厂
云南省公路开发投资有限责任公司文山管理处富
马三星骋开了两万两千多公里,发动机指示灯长
大四的时候去工厂实习,能算基层工作经历吗
股票连跌30%了,怎么操作
35个0.01是多少和44个0.1是多少
推荐资讯
合同一式九份,三方各执三份什么意思
求大佬,我的世界GroupManager权限组管理怎么
建设银行卡在ATM机被吞了出个单子
一道数学题,利用微分计算sin29º近似值,
农保外省就医报销多少
造梦西游4怎么进不去一直都是游戏初始化
娇芙达女性养生馆我想知道这个在什么地方
人造地球卫星绕地球做匀速圆周运动,假如卫星
为什么携程网订票贵这么多?
手机wifi可以登录路由器到无法上网是怎么回事
双三者是什么意思啊?
【人与自然关系的理解】如何理解正确的实践观
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?