计算机中的信息包括数据信息和控制信息,数据信息又可分为数值和非数值信息。非数值信息和控制信息包括了字母、各种控制符号、图形符号等,它们都以二进制编码方式存入计算机并得以处理,这种对字母和符号进行编码的二进制代码称为字符代码(Character Code)。计算机中常用的字符编码有ASCII码(美国标准信息交换码)和EBCDIC码(扩展的BCD交换码)。详见http://baike.baidu.com/link?url=4hSWzmmdRi0e_MKmCXlOEwPV3pv9sMJV19vRM3eas3javbcdJI-czLi70pT2o0rx_YLXZOTMGpyI7taMdWDHia
*!* 作者:十豆三
*!* 日期:2011-11-15
*!* vfp版本:vfp9.0(SP2 7423)
*!* 操作系统:Windows XP(SP3)
*!* ANSI:
*!* ANSI字符串我们最熟悉,英文占一个字节,汉字2个字节,以一个\0结尾,常用于txt文本文件
*!* Unicode:
*!* Unicode字符串每个字符(汉字、英文字母)都占2个字节,以2个连续的\0结尾,
*!* NT操作系统内核用的是这种字符串,常被定义为typedef unsigned short wchar_t;
*!* 所以我们有时常会见到什么char*无法转换为unsigned short*之类的错误,其实就是unicode。
*!* little endian:最低位地址存放低位字节,可称低位优先,内存从最低地址开始按顺序存放(低数位数字先写)。最低位字节放最前面。
*!* big endian: 最低位地址存放高位字节,可称高位优先,内存从最低地址开始按顺序存放(高数位数字先写)。最高位字节放最前面。
*!* UTF8:
*!* UTF8是Unicode一种压缩形式,英文A在unicode中表示为0x0041,老外觉得这种存储方式太浪费,
*!* 因为浪费了50%的空间,于是就把英文压缩成1个字节,成了utf8编码,但是汉字在utf8中占3个字节,
*!* 显然用做中文不如ANSI合算,这就是中国的网页用作ANSI编码而老外的网页常用utf8的原因。
*!* 签名BOM:
*!* BOM 是 Byte Order Mark 的缩写(字节顺序标记),是编码方案里用于标识编码的标准标记。
*!* ANSI 文件没有 BOM
*!* UTF-8 文件的 BOM 为:EF BB BF,不过 UTF-8 文件可以有 BOM,也可以没有 BOM
*!* Unicode big endian 文件的 BOM 为:FE FF
*!* Unicode little endian 文件的 BOM 为:FF FE
*!* vfp 的 UI 不支持 unicode,但可以读写 unicode 文件。
*--------------------------------------------------------------------------------
*-- 字符串保存为 ANSI、UTF-8、Unicode(little endian)、Unicode big endian 格式文件
lcStr='abc十豆三123'
*-- 生成的 ANSI编码文件.txt:12字节(每个英文和数字占1个字节,每个汉字占2个字节)
=Strtofile(lcStr,'c:\ANSI编码文件.txt')
*--生成的 UTF-8编码文件.txt:18字节(每个英文和数字占1个字节,每个汉字占3个字节)
=Strtofile(Strconv(lcStr,9),'c:\UTF-8编码文件.txt',4)
*-- 生成的 Unicode编码文件.txt:20字节(每个英文、数字及汉字占2个字节,另加上BOM长度2)
=Strtofile(Strconv(lcStr,5),'c:\Unicode编码文件.txt',2)
*-- 生成的 Unicode big endian 编码文件.txt:20字节(每个英文、数字及汉字占2个字节,另加上BOM长度2)
lcUnicodeStr=Strconv(lcStr,5)
lnStrLen=Len(lcUnicodeStr)
lcUnicodeBigStr=''
For lnI=1TolnStrLenStep2
lcUnicodeBigStr=lcUnicodeBigStr+Substr(lcUnicodeStr,lnI+1,1)+Substr(lcUnicodeStr,lnI,1)
Endfor
=Strtofile(Chr(0xFE)+Chr(0xFF)+lcUnicodeBigStr,'c:\Unicode big endian编码文件.txt')
*------------------------------------------------------------------------------
*-- ANSI 格式文件 转 UTF-8、Unicode(little endian)、Unicode big endian 格式文件
*-- ANSI To UTF-8 (文件头写入UTF-8文件的BOM)
=Strtofile(Strconv(Filetostr('c:\ANSI编码文件.txt'),9),'c:\UTF-8编码文件.txt',4)
*-- ANSI To Unicode (文件头写入Unicode文件的BOM)
=Strtofile(Strconv(Filetostr('c:\ANSI编码文件.txt'),5),'c:\Unicode编码文件.txt',2)
*-- ANSI To Unicode big endian (文件头写入Unicode big endian文件的BOM)
lcUnicodeStr=Strconv(Filetostr('c:\ANSI编码文件.txt'),5)
lnStrLen=Len(lcUnicodeStr)
lcUnicodeBigStr=''
For lnI=1TolnStrLenStep2
lcUnicodeBigStr=lcUnicodeBigStr+Substr(lcUnicodeStr,lnI+1,1)+Substr(lcUnicodeStr,lnI,1)
Endfor
=Strtofile(Chr(0xFE)+Chr(0xFF)+lcUnicodeBigStr,'c:\Unicode big endian编码文件.txt')
*------------------------------------------------------------------------------
*-- UTF-8 格式文件 转 ANSI、Unicode(little endian)、Unicode big endian 格式文件
lcUtf8Str=Filetostr('c:\UTF-8编码文件.txt')
If Left(lcUtf8Str,3)=Chr(0xEF)+Chr(0xBB)+Chr(0xBF)
lcUtf8Str=Substr(lcUtf8Str,4)&& 去掉 UTF-8 的 BOM
Endif
*-- UTF-8 To ANSI (ANSI文件没有签名BOM)
=Strtofile(Strconv(lcUtf8Str,11),'c:\ANSI编码文件.txt')
*-- UTF-8 To Unicode (文件头写入Unicode文件的BOM)
=Strtofile(Strconv(lcUtf8Str,12),'c:\Unicode编码文件.txt',2)
*-- UTF-8 To Unicode big endian (文件头写入Unicode big endian文件的BOM)
lcUnicodeStr=Strconv(lcUtf8Str,12)
lnStrLen=Len(lcUnicodeStr)
lcUnicodeBigStr=''
For lnI=1TolnStrLenStep2
lcUnicodeBigStr=lcUnicodeBigStr+Substr(lcUnicodeStr,lnI+1,1)+Substr(lcUnicodeStr,lnI,1)
Endfor
=Strtofile(Chr(0xFE)+Chr(0xFF)+lcUnicodeBigStr,'c:\Unicode big endian编码文件.txt')
*------------------------------------------------------------------------------
*-- Unicode(little endian) 格式文件 转 ANSI、UTF-8、Unicode big endian 格式文件
lcUnicodeStr=Filetostr('c:\Unicode编码文件.txt')
If Left(lcUnicodeStr,2)=Chr(0xFF)+Chr(0xFE)
lcUnicodeStr=Substr(lcUnicodeStr,3)&& 去掉 Unicode 的 BOM
Endif
*-- Unicode To ANSI (ANSI文件没有签名BOM)
=Strtofile(Strconv(lcUnicodeStr,6),'c:\ANSI编码文件.txt')
*-- Unicode To UTF-8 (文件头写入UTF-8文件的BOM)
=Strtofile(Strconv(lcUnicodeStr,10),'c:\UTF-8编码文件.txt',4)
*-- Unicode To Unicode big endian (文件头写入Unicode big endian文件的BOM)
lnStrLen=Len(lcUnicodeStr)
lcUnicodeBigStr=''
For lnI=1TolnStrLenStep2
lcUnicodeBigStr=lcUnicodeBigStr+Substr(lcUnicodeStr,lnI+1,1)+Substr(lcUnicodeStr,lnI,1)
Endfor
=Strtofile(Chr(0xFE)+Chr(0xFF)+lcUnicodeBigStr,'c:\Unicode big endian编码文件.txt')
*------------------------------------------------------------------------------
*-- Unicode big endian 格式文件 转 ANSI、UTF-8、Unicode(little endian) 格式文件
lcUnicodeBigStr=Filetostr('c:\Unicode big endian编码文件.txt')
If Left(lcUnicodeBigStr,2)=Chr(0xFE)+Chr(0xFF)
lcUnicodeBigStr=Substr(lcUnicodeBigStr,3)&& 去掉 Unicode big endian 的 BOM
Endif
lnStrLen=Len(lcUnicodeBigStr)
lcUnicodeStr=''
For lnI=1TolnStrLenStep2
lcUnicodeStr=lcUnicodeStr+Substr(lcUnicodeBigStr,lnI+1,1)+Substr(lcUnicodeBigStr,lnI,1)
Endfor
*-- Unicode big endian To ANSI (ANSI文件没有签名BOM)
=Strtofile(Strconv(lcUnicodeStr,6),'c:\ANSI编码文件.txt')
*-- Unicode big endian To UTF-8 (文件头写入UTF-8文件的BOM)
=Strtofile(Strconv(lcUnicodeStr,10),'c:\UTF-8编码文件.txt',4)
*-- Unicode big endian To Unicode (文件头写入Unicode文件的BOM)
=Strtofile(lcUnicodeStr,'c:\Unicode编码文件.txt',2)