- UID
- 77
- 精华
- 积分
- 9474
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
首先说明:ANSI、UNICODE、UNICODE-BE(UNICODE BIG ENDIAN)的名称可能有歧义,以上名称来自WINDOWS记事本“另存为”对话框的【编码选择】处。
BSTR就是VB的STRING字符串,它本质上是UNICODE字符串。但讽刺的是,VB的自带控件竟然都不支持UNICODE。比如你想在中文系统上用VB自带控件(比如LABEL和TEXTBOX)正确显示德语的变音字母,是不可能的。要做的这点,必须用API自行创建控件。
ANSI字符串是最常见的,等同于C语言里的CHAR[],它的格式可以简单理解为“英文字符1字节+非英文字符2字节”。它的缺点在于非英文字符的编码有N种方法,比如简体中文WINDOWS系统的汉字编码是GBK(兼容GB2312),繁体中文WINDOWS系统的汉字编码是BIG5。如果在繁体中文WINDOWS系统上保存一个ANSI格式文本文件放到简体中文WINDOWS系统上打开就会显示为乱码,反之亦然。如果你的程序用了A版本的API,比如【MessageBoxA(0,"字符串",0,0)】,那么在非简体中文WINDOWS系统上看到的弹框将会是乱码;如果你的程序用的是W版本的API,比如【MessageBoxW(0,L"字符串",0,0)】,那么在非简体中文WINDOWS系统上看到的弹框则是正常的。
UNICODE字符串等同于C语言里的WCHAR[],所有字符就一律2个字节。该编码全球通用,不受地区和系统的影响。但如果字符串主要由英文字符组成时,会造成大量空间浪费。比如ABCD的ANSI编码是\x41\x42\x43\x44,但UNICODE编码则是\x41\x0\x42\x0\x43\x0\x44\x0。
UNICODE-BE字符串就是把UNICODE字符串的2个字节的位置调换了一下。比如某个字符的UNICODE编码是0xAA55,那么UNICODE-BE的编码就是0x55AA。该编码全球通用,不受地区和系统的影响。
综合ANSI和UNICODE的优缺点,于是就有了UTF8。对于纯英文字符,UTF8和ANSI是兼容的;对于非英文字符,UTF8有一套固定编码方法。该编码全球通用,不受地区和系统的影响。UTF8的缺点是一个中文字符的长度可能高达3字节甚至4字节。
使用MultiByteToWideChar和WideCharToMultiByte能让VB字符串(BSTR)和其它字符串相互转换。
以下是测试(把代码复制并保存为FRM文件即可运行): |
|