ANSI, UNICODE,都是字符集,是字符编码(ID)
GB2312是ANSI的扩展,可以看成也是ANSI,只不过占据了2个字节。
UTF-8是编码规则,是对字符集的二次实现,理论上不仅可以编码ANSI,也可以编码UNICODE,只不过一般只有对UNICODE的编码。
在屏幕中显示一个字符要经过这样的过程
一:ANSI,UNICODE -> 字模 -> ...
二: UTF8 -> ANSI,UNICODE -> 字模 -> ...
UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8 的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0
,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
2)对于n
字节的符号(n > 1
),第一个字节的前n
位都设为1
,第n + 1
位设为0
,后面字节的前两位一律设为10
。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
下表总结了编码规则,字母x
表示可用编码的位。
Unicode符号范围 | UTF-8编码方式 (十六进制) | (二进制) ----------------------+--------------------------------------------- 0000 0000-0000 007F | 0xxxxxxx 0000 0080-0000 07FF | 110xxxxx 10xxxxxx 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
跟据上表,解读 UTF-8 编码非常简单。如果一个字节的第一位是0
,则这个字节单独就是一个字符;如果第一位是1
,则连续有多少个1
,就表示当前字符占用多少个字节。
---
如果程序是ANSI 能不用使用要求UTF-8的DLL呢? 是可以的。因为字符的结束符是1个字节。
如果程序是UNICODE, 能不用使用UTF-8的DLL呢? 是不可以的。因为字符的结束符UNICODE是2个字节UTF-8字符是1个字节。
如果程序是ANSI , 能不用使用UNICODE的DLL呢? 是不可以的。因为字符的结束符ANSI是1个字节UNICODE是2个字节。
如果程序是UNICODE, 能不用使用ANSI 的DLL呢? 是不可以的。因为字符的结束符ANSI是1个字节UNICODE是2个字节。
int sqlite3_open(const char *filename, /* Database filename (UTF-8) */sqlite3 **ppDb /* OUT: SQLite db handle */ ); int sqlite3_open16(const void *filename, /* Database filename (UTF-16) */sqlite3 **ppDb /* OUT: SQLite db handle */ ); int sqlite3_open_v2(const char *filename, /* Database filename (UTF-8) */sqlite3 **ppDb, /* OUT: SQLite db handle */int flags, /* Flags */const char *zVfs /* Name of VFS module to use */ );