VB.NET中用FileIO.TextFieldParser读取ANSI文件时字符异常的排查与解决
问题:ANSI编码文件在VB.NET TextFieldParser中读取€字符异常
我用Notepad++打开某文件显示正常,编码标识为ANSI,但用VB.NET的FileIO.TextFieldParser读取时,所有内置Encoding常量都无法得到正确文本。其中用Latin1编码读取的结果最接近,但本该显示的€字符变成了ChrW(128)(VS中显示该值,无法正常渲染)。调用代码如下:
Using tfp As New Microsoft.VisualBasic.FileIO.TextFieldParser(uPath, enc) s = tfp.ReadToEnd End Using
原因分析
- Notepad++里的「ANSI」并非严格意义上的ANSI标准,而是Windows系统默认的代码页(通常是CP1252,即Windows-1252)。
- Latin1(ISO-8859-1)编码只覆盖了Unicode的U+0000到U+00FF范围,且其中0x80-0x9F是未定义的控制字符;而Windows-1252把这些字节映射成了实用字符,比如0x80对应€(Unicode U+20AC)。
- 当你用Latin1编码读取Windows-1252编码的文件时,字节0x80会被直接转成Unicode的U+0080(不可见控制字符),也就是
ChrW(128),而非正确的€字符。
解决方法
直接指定使用Windows-1252编码读取文件,而非Latin1或其他内置编码。修改后的代码如下:
' 获取Windows-1252编码实例 Dim enc As Encoding = Encoding.GetEncoding(1252) Using tfp As New Microsoft.VisualBasic.FileIO.TextFieldParser(uPath, enc) s = tfp.ReadToEnd End Using
如果你的系统默认代码页不是CP1252(比如部分非西欧语言系统),可以先确认Notepad实际使用的代码页:在Notepad中打开文件后,查看「编码」菜单下的具体选项(比如「编码→字符集→西欧→Windows-1252」),然后用对应的代码页编号调用Encoding.GetEncoding即可。
内容的提问来源于stack exchange,提问作者tmighty
相关产品推荐
相关产品推荐

