首先我们来复习一下编码的基本概念,由于历史原因,Text文件存在ASCII,Unicode,UTF-8,UTF-7等等编码方式;对于中文,还有GB2312;对于Unicode还有Unicode-16,Unicode-32;对于Unicode-16又分为Unicode-16 Little Endian,Unicode-16 Big Endian。要把所有的编码方式列举出来是相当的复杂。想仔细的研究一下各种编码的规则和由来可以参考一下这篇文章:编码,charset,乱码,unicode,utf-8与net简单释义。我们读取一个文本文件时,总是使用某一种编码方式去解码这个文本文件,如果我们使用的解码方式和文本文件本身的编码方式不一致,最后的结果就是得到一个乱码的文件。
这里涉及到一个BOM(Byte Order Mark) 的概念。简单的讲,在Unicode标准中,为了标示文本文件的编码类型,可以在文本文件的开始插入几个特殊的byte,通过这几个特殊的byte,应用程序就可以鉴别文本文件使用的是那种编码了。那几个特殊的byte也被称之为BOM(参考:http://unicode.org/faq/utf_bom.html )。
GetTextEncodingType 1PrivateFunction GetTextEncodingType()Function GetTextEncodingType(ByVal Buffer AsByte()) As PaTextEncoding 2'UTF7 = No byte higher than 127 3'UTF8 = first three bytes EF BB BF 4'UTF16BigEndian = first two bytes FE FF 5'UTF16LittleEndian = first two bytes FF FE 6 7'Lets do the easy ones first 8If Buffer(0) =255And Buffer(1) =254Then 9Return PaTextEncoding.UTF16LittleEndian 10EndIf 11If Buffer(0) =254And Buffer(1) =255Then 12Return PaTextEncoding.UTF16BigEndian 13EndIf 14If Buffer(0) =239And Buffer(1) =187And Buffer(2) =191Then 15Return PaTextEncoding.UTF8 16EndIf 17 18'This does a simple test to verify that there are no bytes with a value larger than 127 19'which would be invalid in UTF-7 encoding 20Dim i AsInteger 21For i =0To100 22If Buffer(i) >127Then 23Return PaTextEncoding.Unknown 24EndIf 25Next 26Return PaTextEncoding.UTF7 27 28End Function 29
Code 1ProtectedFunction GetAsciiString()Function GetAsciiString(ByVal Buffer AsByte(), ByVal SourceEncoding As Encoding) AsString 2 3' Create two different encodings. 4Dim TargetEncoding As Encoding = Encoding.ASCII 5 6' Perform the conversion from one encoding to the other. 7Dim asciiBytes AsByte() = Encoding.Convert(SourceEncoding, TargetEncoding, Buffer) 8 9' Convert the new byte[] into an ascii string. 10Dim asciiString AsString= System.Text.Encoding.ASCII.GetString(asciiBytes) 11 12Return asciiString 13End Function 14
根据不同的编码方式,传入不同的参数:
Code 1Dim strScript AsString="" 2SelectCase sqlFile.Encoding 3Case PaTextEncoding.UTF16LittleEndian 4 strScript = GetAsciiString(sqlFile.Buffer, System.Text.Encoding.Unicode) 'System.Text.Encoding.Unicode.GetString(sqlFile.Buffer) 5Case PaTextEncoding.UTF16BigEndian 6 strScript = GetAsciiString(sqlFile.Buffer, System.Text.Encoding.BigEndianUnicode) 'System.Text.Encoding.BigEndianUnicode.GetString(sqlFile.Buffer) 7Case PaTextEncoding.UTF8 8 strScript = GetAsciiString(sqlFile.Buffer, System.Text.Encoding.UTF8) 'System.Text.Encoding.UTF8.GetString(sqlFile.Buffer) 9Case PaTextEncoding.UTF7 10 strScript = GetAsciiString(sqlFile.Buffer, System.Text.Encoding.UTF7) 'System.Text.Encoding.UTF7.GetString(sqlFile.Buffer) 11Case PaTextEncoding.Unknown 12ThrowNew Exception(String.Format(SQL_UnknownFile, sqlFile.Name)) 13EndSelect 14 15'This check needs to be included because the unicode Byte Order mark results in an extra character at the start of the file 16'The extra character - '?' - causes an error with the database. 17If strScript.StartsWith("?") Then 18 strScript = strScript.Substring(1) 19EndIf 20
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述