新聞中心
VB 如何判斷txt文件的編碼格式
哈哈!一周前我剛剛遇到類似問(wèn)題 慷慨把代碼給你吧??!順便貼上所有格式轉(zhuǎn)UTF8的代碼
成都創(chuàng)新互聯(lián)公司于2013年創(chuàng)立,先為玉泉等服務(wù)建站,玉泉等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為玉泉企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
(我本來(lái)是給XML讀取用的 MSXML太挑剔了 只讀UTF-8格式- - 不過(guò)轉(zhuǎn)UTF-8的還是有點(diǎn)問(wèn)題 記事本打開(kāi)看上去讀取沒(méi)有問(wèn)題 但是用MSXML讀取依然有點(diǎn)問(wèn)題。)
原理:根據(jù)文件前兩個(gè)字符判斷
注意 放在一個(gè)模塊里面。
使用:GetEncoding(文件路徑),返回一個(gè)Encoding枚舉體(仿.net)
例如:
Dim ReturnEncoding As Encoding
ReturnEncoding = GetEncoding("C:\1.txt")
If ReturnEncoding = UTF8 Then
'UTF處理
ElseIf ReturnEncoding = Unicode Then
'Unicode
Elseif ReturnEncoding = UnicodeBigEndian Then
'Unicode-BE處理
Else
'ANSI處理
End If
========模塊Encoding.bas==========
Option Explicit
Public Enum Encoding
ANSI
Unicode
UnicodeBigEndian
UTF8
End Enum
Public Function GetEncoding(FileName As String) As Encoding
On Error GoTo Err
Dim fBytes(1) As Byte, freeNum As Integer
freeNum = FreeFile
Open FileName For Binary Access Read As #freeNum
Get #freeNum, , fBytes(0)
Get #freeNum, , fBytes(1)
Close #freeNum
If fBytes(0) = HFF And fBytes(1) = HFE Then GetEncoding = Unicode
If fBytes(0) = HFE And fBytes(1) = HFF Then GetEncoding = UnicodeBigEndian
If fBytes(0) = HEF And fBytes(1) = HBB Then GetEncoding = UTF8
Err:
End Function
Public Sub FileToUTF8(FileName As String)
Dim fBytes() As Byte, uniString As String, freeNum As Integer
Dim ADO_Stream As Object
freeNum = FreeFile
ReDim fBytes(FileLen(FileName))
Open FileName For Binary Access Read As #freeNum
Get #freeNum, , fBytes
Close #freeNum
uniString = StrConv(fBytes, vbUnicode)
Set ADO_Stream = CreateObject("ADODB.Stream")
With ADO_Stream
.Type = 2
.Mode = 3
.Charset = "utf-8"
.open
.WriteText uniString
.SaveToFile FileName, 2
.Close
End With
Set ADO_Stream = Nothing
End Sub
vb.net 二進(jìn)制讀取文件
VB.NET打開(kāi)二進(jìn)制文件用fileopen完成,打開(kāi)二進(jìn)制文件的形式為:openmode.binary
讀取二進(jìn)制文件用的是fileget方法,寫入二進(jìn)制文件用的是fileput方法。
應(yīng)用示例:將一批隨機(jī)數(shù)保存在一個(gè)dat文件中,然后再將其提取到文本框中。
二進(jìn)制文件的讀寫一批隨機(jī)數(shù)的存取,程序?yàn)椋?/p>
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim x, i, fn As Integer
Dim s As String = ""
fn = FreeFile()
FileOpen(fn, "d:\data.dat", OpenMode.Binary)
For i = 1 To 8
x = Int(Rnd() * 100)
s = s + Str(x)
FilePut(fn, x)
Next
FileClose(fn)
TextBox1.Text = s
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim x, fn As Integer
Dim s As String = ""
fn = FreeFile()
FileOpen(fn, "d:\data.dat", OpenMode.Binary)
Do While Not EOF(fn)
FileGet(fn, x)
s = s + Str(x) + " "
Loop
FileClose(fn)
TextBox1.Text = s
End Sub
VB 怎么獲取或判斷txt文件的編碼格式
哈哈!一周前我剛剛遇到類似問(wèn)題 慷慨把代碼給你吧??!順便貼上所有格式轉(zhuǎn)UTF8的代碼
(我本來(lái)是給XML讀取用的 MSXML太挑剔了 只讀UTF-8格式- - 不過(guò)轉(zhuǎn)UTF-8的還是有點(diǎn)問(wèn)題 記事本打開(kāi)看上去讀取沒(méi)有問(wèn)題 但是用MSXML讀取依然有點(diǎn)問(wèn)題。)
原理:根據(jù)文件前兩個(gè)字符判斷
注意 放在一個(gè)模塊里面。
使用:GetEncoding(文件路徑),返回一個(gè)Encoding枚舉體(仿.net)
例如:
Dim ReturnEncoding As Encoding
ReturnEncoding = GetEncoding("C:\1.txt")
If ReturnEncoding = UTF8 Then
'UTF處理
ElseIf ReturnEncoding = Unicode Then
'Unicode
Elseif ReturnEncoding = UnicodeBigEndian Then
'Unicode-BE處理
Else
'ANSI處理
End If
========模塊Encoding.bas==========
Option Explicit
Public Enum Encoding
ANSI
Unicode
UnicodeBigEndian
UTF8
End Enum
Public Function GetEncoding(FileName As String) As Encoding
On Error GoTo Err
Dim fBytes(1) As Byte, freeNum As Integer
freeNum = FreeFile
Open FileName For Binary Access Read As #freeNum
Get #freeNum, , fBytes(0)
Get #freeNum, , fBytes(1)
Close #freeNum
If fBytes(0) = HFF And fBytes(1) = HFE Then GetEncoding = Unicode
If fBytes(0) = HFE And fBytes(1) = HFF Then GetEncoding = UnicodeBigEndian
If fBytes(0) = HEF And fBytes(1) = HBB Then GetEncoding = UTF8
Err:
End Function
Public Sub FileToUTF8(FileName As String)
Dim fBytes() As Byte, uniString As String, freeNum As Integer
Dim ADO_Stream As Object
freeNum = FreeFile
ReDim fBytes(FileLen(FileName))
Open FileName For Binary Access Read As #freeNum
Get #freeNum, , fBytes
Close #freeNum
uniString = StrConv(fBytes, vbUnicode)
Set ADO_Stream = CreateObject("ADODB.Stream")
With ADO_Stream
.Type = 2
.Mode = 3
.Charset = "utf-8"
.open
.WriteText uniString
.SaveToFile FileName, 2
.Close
End With
Set ADO_Stream = Nothing
End Sub
VB.NET如何獲取任何格式文件的文字信息
Option?Explicit
'mTextUTF.bas
'模塊:UTF文本文件訪問(wèn)
'作者:zyl910
'版本:1.0
'日期:2006-1-23
'==?說(shuō)明?===================================================
'支持Unicode編碼的文本文件讀寫。暫時(shí)支持ANSI、UTF-8、UTF-16LE、UTF-16BE這幾種編碼文本
'==?更新記錄?===============================================
'[V1.0]?2006-1-23
'1.支持最常見(jiàn)的ANSI、UTF-8、UTF-16LE、UTF-16BE這幾種編碼文本
'##?編譯預(yù)處理常數(shù)?#########################################
'==?全局常數(shù)?===============================================
'IncludeAPILib:引用了API庫(kù),此時(shí)不需要手動(dòng)寫API聲明
'##?API?####################################################
#If?IncludeAPILib?=?0?Then
'==?File?===================================================
Private?Declare?Function?CreateFile?Lib?"kernel32"?Alias?"CreateFileA"?(ByVal?lpFileName?As?String,?ByVal?dwDesiredAccess?As?Long,?ByVal?dwShareMode?As?Long,?ByVal?lpSecurityAttributes?As?Long,?ByVal?dwCreationDisposition?As?Long,?ByVal?dwFlagsAndAttributes?As?Long,?ByVal?hTemplateFile?As?Long)?As?Long
Private?Declare?Function?CloseHandle?Lib?"kernel32"?(ByVal?hObject?As?Long)?As?Long
Private?Declare?Function?ReadFile?Lib?"kernel32"?(ByVal?hFile?As?Long,?lpBuffer?As?Any,?ByVal?nNumberOfBytesToRead?As?Long,?lpNumberOfBytesRead?As?Long,?ByVal?lpOverlapped?As?Long)?As?Long
Private?Declare?Function?WriteFile?Lib?"kernel32"?(ByVal?hFile?As?Long,?lpBuffer?As?Any,?ByVal?nNumberOfBytesToWrite?As?Long,?lpNumberOfBytesWritten?As?Long,?ByVal?lpOverlapped?As?Long)?As?Long
Private?Declare?Function?GetFileSize?Lib?"kernel32"?(ByVal?hFile?As?Long,?lpFileSizeHigh?As?Long)?As?Long
Private?Declare?Function?SetFilePointer?Lib?"kernel32"?(ByVal?hFile?As?Long,?ByVal?lDistanceToMove?As?Long,?lpDistanceToMoveHigh?As?Long,?ByVal?dwMoveMethod?As?Long)?As?Long
Private?Const?INVALID_HANDLE_VALUE?=?-1
Private?Const?GENERIC_READ?=?H80000000
Private?Const?GENERIC_WRITE?=?H40000000
Private?Const?FILE_SHARE_READ?=?H1
Private?Const?FILE_SHARE_WRITE?=?H2
Private?Const?Create_NEW?=?1
Private?Const?Create_ALWAYS?=?2
Private?Const?OPEN_EXISTING?=?3
Private?Const?OPEN_ALWAYS?=?4
Private?Const?TRUNCATE_EXISTING?=?5
Private?Const?FILE_ATTRIBUTE_NORMAL?=?H80
Private?Const?FILE_BEGIN?=?0
Private?Const?FILE_CURRENT?=?1
Private?Const?FILE_END?=?2
'==?Unicode?================================================
Private?Declare?Function?MultiByteToWideChar?Lib?"kernel32"?(ByVal?CodePage?As?Long,?ByVal?dwFlags?As?Long,?ByRef?lpMultiByteStr?As?Any,?ByVal?cchMultiByte?As?Long,?ByRef?lpWideCharStr?As?Any,?ByVal?cchWideChar?As?Long)?As?Long
Private?Declare?Function?WideCharToMultiByte?Lib?"kernel32"?(ByVal?CodePage?As?Long,?ByVal?dwFlags?As?Long,?ByRef?lpWideCharStr?As?Any,?ByVal?cchWideChar?As?Long,?ByRef?lpMultiByteStr?As?Any,?ByVal?cchMultiByte?As?Long,?ByRef?lpDefaultChar?As?Any,?ByVal?lpUsedDefaultChar?As?Long)?As?Long
Private?Const?CP_UTF8?As?Long?=?65001
#End?If
'###########################################################
'Unicode編碼格式
Public?Enum?UnicodeEncodeFormat
UEF_ANSI?=?0?'ANSI+DBCS
UEF_UTF8?'UTF-8
UEF_UTF16LE?'UTF-16LE
UEF_UTF16BE?'UTF-16BE
UEF_UTF32LE?'UTF-32LE
UEF_UTF32BE?'UTF-32BE
UEF_Auto?=?-1?'自動(dòng)識(shí)別編碼
'隱藏項(xiàng)目
[_UEF_Min]?=?UEF_ANSI
[_UEF_Max]?=?UEF_UTF32BE
End?Enum
'ANSI+DBCS方式的文本所使用的代碼頁(yè)。默認(rèn)為0,表示使用系統(tǒng)當(dāng)前代碼頁(yè)??梢岳迷搮?shù)實(shí)現(xiàn)讀取其他代碼編碼的文本,比如想在?簡(jiǎn)體中文平臺(tái)下?讀取?繁體中文平臺(tái)生成的txt,就將它設(shè)為950
Public?UEFCodePage?As?Long
'判斷BOM
'返回值:BOM所占字節(jié)
'dwFirst:[in]文件最開(kāi)始的4個(gè)字節(jié)
'fmt:[out]返回編碼類型
Public?Function?UEFCheckBOM(ByVal?dwFirst?As?Long,?ByRef?fmt?As?UnicodeEncodeFormat)?As?Long
If?dwFirst?=?HFEFF?Then
fmt?=?UEF_UTF32LE
UEFCheckBOM?=?4
ElseIf?dwFirst?=?HFFFE0000?Then
fmt?=?UEF_UTF32BE
UEFCheckBOM?=?4
ElseIf?(dwFirst?And?HFFFF)?=?HFEFF?Then
fmt?=?UEF_UTF16LE
UEFCheckBOM?=?2
ElseIf?(dwFirst?And?HFFFF)?=?HFFFE?Then
fmt?=?UEF_UTF16BE
UEFCheckBOM?=?2
ElseIf?(dwFirst?And?HFFFFFF)?=?HBFBBEF?Then
fmt?=?UEF_UTF8
UEFCheckBOM?=?3
Else
fmt?=?UEF_ANSI
UEFCheckBOM?=?0
End?If
End?Function
'生成BOM
'返回值:BOM所占字節(jié)
'fmt:[in]編碼類型
'dwFirst:[out]文件最開(kāi)始的4個(gè)字節(jié)
Public?Function?UEFMakeBOM(ByVal?fmt?As?UnicodeEncodeFormat,?ByRef?dwFirst?As?Long)?As?Long
Select?Case?fmt
Case?UEF_UTF8
dwFirst?=?HBFBBEF
UEFMakeBOM?=?3
Case?UEF_UTF16LE
dwFirst?=?HFEFF
UEFMakeBOM?=?2
Case?UEF_UTF16BE
dwFirst?=?HFFFE
UEFMakeBOM?=?2
Case?UEF_UTF32LE
dwFirst?=?HFEFF
UEFMakeBOM?=?4
Case?UEF_UTF32BE
dwFirst?=?HFFFE0000
UEFMakeBOM?=?4
Case?Else
dwFirst?=?0
UEFMakeBOM?=?0
End?Select
End?Function
'判斷文本文件的編碼類型
'返回值:編碼類型。文件無(wú)法打開(kāi)時(shí),返回UEF_Auto
'FileName:文件名
Public?Function?UEFCheckTextFileFormat(ByVal?FileName?As?String)?As?UnicodeEncodeFormat
Dim?hFile?As?Long
Dim?dwFirst?As?Long
Dim?nNumRead?As?Long
'打開(kāi)文件
hFile?=?CreateFile(FileName,?GENERIC_READ,?FILE_SHARE_READ?Or?FILE_SHARE_WRITE,?ByVal?0,?OPEN_EXISTING,?FILE_ATTRIBUTE_NORMAL,?ByVal?0)
If?INVALID_HANDLE_VALUE?=?hFile?Then?'文件無(wú)法打開(kāi)
UEFCheckTextFileFormat?=?UEF_Auto
Exit?Function
End?If
'判斷BOM
dwFirst?=?0
Call?ReadFile(hFile,?dwFirst,?4,?nNumRead,?ByVal?0)
nNumRead?=?UEFCheckBOM(dwFirst,?UEFCheckTextFileFormat)
'Debug.Print?nNumRead
'關(guān)閉文件
Call?CloseHandle(hFile)
End?Function
'讀取文本文件
'返回值:讀取的文本。返回vbNullString表示文件無(wú)法打開(kāi)
'FileName:[in]文件名
'fmt:[in,out]使用何種文本編碼格式來(lái)讀取文本。為UEF_Auto時(shí)表示自動(dòng)判斷,且在fmt參數(shù)返回文本所用編碼格式
Public?Function?UEFLoadTextFile(ByVal?FileName?As?String,?Optional?ByRef?fmt?As?UnicodeEncodeFormat?=?UEF_Auto)?As?String
Dim?hFile?As?Long
Dim?nFileSize?As?Long
Dim?nNumRead?As?Long
Dim?dwFirst?As?Long
Dim?CurFmt?As?UnicodeEncodeFormat
Dim?cbBOM?As?Long
Dim?cbTextData?As?Long
Dim?CurCP?As?Long
Dim?byBuf()?As?Byte
Dim?cchStr?As?Long
Dim?I?As?Long
Dim?byTemp?As?Byte
'判斷fmt范圍
If?fmt??UEF_Auto?Then
If?fmt??[_UEF_Min]?Or?fmt??[_UEF_Max]?Then
GoTo?FunEnd
End?If
End?If
'打開(kāi)文件
hFile?=?CreateFile(FileName,?GENERIC_READ,?FILE_SHARE_READ?Or?FILE_SHARE_WRITE,?ByVal?0,?OPEN_EXISTING,?FILE_ATTRIBUTE_NORMAL,?ByVal?0)
If?INVALID_HANDLE_VALUE?=?hFile?Then?'文件無(wú)法打開(kāi)
GoTo?FunEnd
End?If
'判斷文件大小
nFileSize?=?GetFileSize(hFile,?nNumRead)
If?nNumRead??0?Then?'超過(guò)4GB
GoTo?FreeHandle
End?If
If?nFileSize??0?Then?'超過(guò)2GB
GoTo?FreeHandle
End?If
'判斷BOM
dwFirst?=?0
Call?ReadFile(hFile,?dwFirst,?4,?nNumRead,?ByVal?0)
cbBOM?=?UEFCheckBOM(dwFirst,?CurFmt)
'恢復(fù)文件指針
If?fmt?=?UEF_Auto?Then?'自動(dòng)判斷
fmt?=?CurFmt
'cbBOM?=?cbBOM
Else?'手動(dòng)設(shè)置編碼
If?fmt?=?CurFmt?Then?'若編碼相同,則忽略BOM標(biāo)記
'cbBOM?=?cbBOM
Else?'編碼不同,那么都是數(shù)據(jù)
cbBOM?=?0
End?If
End?If
Call?SetFilePointer(hFile,?cbBOM,?ByVal?0,?FILE_BEGIN)
cbTextData?=?nFileSize?-?cbBOM
'讀取數(shù)據(jù)
UEFLoadTextFile?=?""
Select?Case?fmt
Case?UEF_ANSI,?UEF_UTF8
'判斷應(yīng)使用的CodePage
CurCP?=?IIf(fmt?=?UEF_UTF8,?CP_UTF8,?UEFCodePage)
標(biāo)題名稱:vb.net判斷文件編碼 vb判斷文件存在
網(wǎng)站鏈接:http://www.dlmjj.cn/article/dosoppg.html