*!* 作者:十豆三
*!* 日期: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)