[原创分享]UTF-8、Unicode、Ansi的互相转换
UTF-8、Unicode、Ansi的互相转换*----------------------------- by:十豆三 date: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。UTF8: UTF8是Unicode一种压缩形式,英文A在unicode中表示为0x0041,老外觉得这种存储方式太浪费, 因为浪费了50%的空间,于是就把英文压缩成1个字节,成了utf8编码,但是汉字在utf8中占3个字节, 显然用做中文不如ansi合算,这就是中国的网页用作ansi编码而老外的网页常用utf8的原因。签名BOM:BOM 是 Byte Order Mark 的缩写,是编码方案里用于标识编码的标准标记。Ansi 文件没有 BOMUnicode 文件的 BOM 为:FF FEUTF-8 文件的 BOM 为:EF BB BF,不过 UTF-8 文件可以有 BOM,也可以没有 BOMlcUtf8Str=Filetostr('UTF-8编码文件.txt')If Left(lcUtf8Str,3)=Chr(0xEF)+Chr(0xBB)+Chr(0xBF) lcUtf8Str=Substr(lcUtf8Str,4) && 去掉 UTF-8 的 BOMEndif*-- UTF-8 To Ansi (ANSI文件没有签名BOM)=Strtofile(Strconv(lcUtf8Str,11),'Ansi编码文件.txt')*-- UTF-8 To Unicode (文件头写入Unicode文件的BOM)=Strtofile(Strconv(lcUtf8Str,12),'Unicode编码文件.txt',2) && 多谢 dkfdtf 提醒 Strtofile 函数参数3的使用*------------------------------------------------lcUnicodeStr=Filetostr('Unicode编码文件.txt')If Left(lcUnicodeStr,2)=Chr(0xFF)+Chr(0xFE) lcUnicodeStr=Substr(lcUnicodeStr,3) && 去掉 Unicode 的 BOMEndif*-- Unicode To Ansi (ANSI文件没有签名BOM)=Strtofile(Strconv(lcUnicodeStr,6),'Ansi编码文件.txt')*-- Unicode To UTF-8 (文件头写入UTF-8文件的BOM)=Strtofile(Strconv(lcUnicodeStr,10),'UTF-8编码文件.txt',4)*------------------------------------------------*-- Ansi To UTF-8 (文件头写入UTF-8文件的BOM)=Strtofile(Strconv(Filetostr('Ansi编码文件.txt'),9),'UTF-8编码文件.txt',4)*-- Ansi To Unicode (文件头写入Unicode文件的BOM)=Strtofile(Strconv(Filetostr('Ansi编码文件.txt'),5),'Unicode编码文件.txt',2)*------------------------------------------------lcStr='abc十豆三123'*-- 生成的 Ansi编码文件.txt:12字节(每个英文和数字占1个字节,每个汉字占2个字节)=Strtofile(lcStr,'Ansi编码文件.txt')*-- 生成的 Unicode编码文件.txt:20字节(每个英文、数字及汉字占2个字节,另加上BOM长度2)=Strtofile(Strconv(lcStr,5),'Unicode编码文件.txt',2)*--生成的 UTF-8编码文件.txt:18字节(每个英文和数字占1个字节,每个汉字占3个字节)=Strtofile(Strconv(lcStr,9),'UTF-8编码文件.txt',4)