以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  FileSys用法中编码的问题?  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=99583)

--  作者:sjzsdu
--  发布时间:2017/4/21 17:40:00
--  FileSys用法中编码的问题?
Dim file As String = args(0)
Dim s As String = FileSys.ReadAllText(file, Encoding.UTF8)
FileSys.WriteAllText(file, s, False,Encoding.UTF8)

如果打开的文件既有utf8和gbk编码格式的,这时遍历文件夹就会存在问题。
能不能程序来判断要打开的文件的编码格式?




--  作者:有点色
--  发布时间:2017/4/21 17:58:00
--  

mark txt编码

 

 

全局代码

 

Public Function GetFileEncodeType(filename As String) As  System.Text.Encoding
Dim fs = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read)
Dim  br = new System.IO.BinaryReader(fs)
Dim buffer = br.ReadBytes(2)
If buffer(0) >= &HEF Then
    If buffer(0) = &HEF AndAlso buffer(1) = &HBB
       
        Return System.Text.Encoding.UTF8
    Else If buffer(0) = &HFE AndAlso buffer(1) = &HFF
       
        Return System.Text.Encoding.BigEndianUnicode
       
    Else If buffer(0) = &HFF AndAlso buffer(1) = &HFE
       
        Return System.Text.Encoding.Unicode
       
    Else
       
        Return System.Text.Encoding.Default
    End If
Else
    Return System.Text.Encoding.Default
End If
br.close
fs.close
End Function

 

调用函数

 

Dim file As String = "g:\\test.txt"
Dim s As String = FileSys.ReadAllText(file, GetFileEncodeType(file))
msgbox(s)

[此贴子已经被作者于2017/4/21 17:59:50编辑过]

--  作者:sjzsdu
--  发布时间:2017/4/22 8:53:00
--  
Dim file As String = "D:\\暂存\\ceshi\\haha.html"
Dim encode As System.Text.Encoding = GetFileEncodeType(file)
Dim s As String = FileSys.ReadAllText(file, encode)
s = Replace(s,"美文网", "爱阅读")
FileSys.WriteAllText(file, s, False,encode)

命令窗口中执行有下面这个错误
那个函数已经放在全局代码里了

图片点击可在新窗口打开查看

--  作者:有点蓝
--  发布时间:2017/4/22 10:22:00
--  
这个和代码没有关系。文件是只读的,或者文件被其它程序锁定,无法保存
--  作者:sjzsdu
--  发布时间:2017/4/22 13:42:00
--  
可是这个文件没有被打开,而且文件的属性也不是只读的。

会不会这个函数占用了这个文件,没有释放出来的原因

--  作者:sjzsdu
--  发布时间:2017/4/22 14:20:00
--  
Dim file As String = "D:\\暂存\\ceshi\\haha.html"
Dim encode As System.Text.Encoding = GetFileEncodeType(file)
Dim s As String = FileSys.ReadAllText(file, encode)

s = Replace(s,"美文网", "爱阅读")
FileSys.WriteAllText("D:\\暂存\\ceshi\\haha11.html", s, False,encode)

这样执行就可以,保存为原来的文件名就出错。但是这样不能满足要求

在做怎样的处理可以确保更改完内容保存到原文件内

--  作者:有点蓝
--  发布时间:2017/4/22 14:36:00
--  
全局代码改改

Public Function GetFileEncodeType(filename As String) As  System.Text.Encoding
Dim fs = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read)
Dim  br = new System.IO.BinaryReader(fs)
Dim buffer = br.ReadBytes(2)
Dim code As System.Text.Encoding = System.Text.Encoding.Default
If buffer(0) >= &HEF Then
    If buffer(0) = &HEF AndAlso buffer(1) = &HBB
        
        code = System.Text.Encoding.UTF8
    Else If buffer(0) = &HFE AndAlso buffer(1) = &HFF
        
        code = System.Text.Encoding.BigEndianUnicode
        
    Else If buffer(0) = &HFF AndAlso buffer(1) = &HFE
        
        code = System.Text.Encoding.Unicode
    End If
End If
br.close
fs.close
Return code
End Function
[此贴子已经被作者于2017/4/22 14:36:38编辑过]

--  作者:sjzsdu
--  发布时间:2017/4/22 15:22:00
--  
嗯,这样就可以了。另外咨询个事情,UTF8无BOM和带BOM有什么区别

我在替换UTF格式编码文件时,带BOM的可以替换过来,不带BOM的就是替换不过来,

我们的这个System.Text.Encoding.UTF8可以做区分吗

--  作者:有点蓝
--  发布时间:2017/4/22 16:11:00
--  
请提供文件测试

https://www.baidu.com/baidu?word=UTF8无BOM&ie=utf-8&tn=myie2dg&ch=6