unicode和ansi的区别

unicode和ansi的区别,第1张

什么是ANSI,什么又是UNICODE呢?其实这是两种不同的编码方式标准,ANSI中的字符采用8bit,而UNICODE中的字符采用16bit。(对于字符来说ANSI以单字节存放英文字符,以双字节存放中文等字符,而Unicode下,英文和中文的字符都以双字节存放)Unicode码也是一种国际标准编码,采用二个字节编码,与ANSI码不兼容。目前,在网络、Windows系统和很多大型软件中得到应用。8bit的ANSI编码只能表示256种字符,表示26个英文字母是绰绰有余的,但是表示汉字,韩国语等有着成千上万个字符的非西方字符肯定就不够了,正是如此才引入了UNICODE标准。

Public Class Form1

    Dim b() As Byte

    Private Sub Button1_Click(ByVal sender As SystemObject, ByVal e As SystemEventArgs) Handles Button1Click

        b = SystemTextEncodingDefaultGetBytes(TextBox1Text)

        For i = 0 To UBound(b)

            TextBox2AppendText(iToString & " ")

        Next

    End Sub

 

    Private Sub Button2_Click(ByVal sender As SystemObject, ByVal e As SystemEventArgs) Handles Button2Click

        TextBox1Text = SystemTextEncodingDefaultGetString(b)

    End Sub

 

    Private Sub Form1_Load(ByVal sender As SystemObject, ByVal e As SystemEventArgs) Handles MyBaseLoad

        TextBox1Text = "Google free online translation service instantly translates text and web pages。 该翻译器支持: 中文(简体), 中文(繁体), shqip, 日本语, русский, langue française "

    End Sub

End ClassVBNet中用String类型表示字符串,内部采用Unicode编码。当需要在网络或串口中收发字符串时,就需要在String和Byte数组之间进行转换,这项功能可以通过SystemTextEncoding类实现。

Private zeroChars() As Char = {ChrW(0)}

Dim descBytes() As Byte = SystemTextEncodingUnicodeGetBytes(mDescription)

Dim description As String = SystemTextEncodingUnicodeGetString(rBuffer, offset, length)TrimEnd(zeroChars)

说明:C语言中用'\0'表示字符串结束,而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_RijndaelSetCipherKey pass, KeyBits  

    m_RijndaelArrayEncrypt 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_RijndaelSetCipherKey pass, KeyBits  

    If m_RijndaelArrayDecrypt(plaintext, ciphertext, 0) <> 0 Then  

        Status = ""  

        Exit Sub  

    End If  

    TextLine = StrConv(plaintext, vbUnicode)  

    For i = 0 To UBound(plaintext)  

        DebugPrint 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  

python 2有两个全局函数可以把对象强制转换成字符串:unicode()把对象转换成Unicode字符串,还有str()把对象转换为非Unicode字符串。

python 3只有一个字符串类型,Unicode字符串,所以str()函数即可完成所有的功能。(Unicode()函数在python3 里已经不存在了。)

另外:

没有专门的char()数据类型,确实没有需要有这个类型。

单引号和双引号字符串是完全相同的——他们没有在任何方面不同。

正则表达式,一定要用自然字符串处理正则表达式,否则会需要很多的反斜杠。

使用help(str)可查看字符串对象定义的所有方法及属性。

由于百分号有特殊作用,所以字符串里面要用百分号的话需要使用"%%",如:"select from my_table where name like '%%测试' "。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/12157629.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存