我有字符串变量txt。它包含“°”度数符号。我想将字符串保存到 ASCII 编码的 CSV 文件中。我使用下面的过程但是“°”符号被转换为“?”。您知道如何正确保存度数符号吗?
Public Sub Write_File(ByVal txt As String, ByVal fName As String)
Try
Using OutFile As New StreamWriter(fName, False, Text.Encoding.ASCII)
OutFile.Write(txt)
End Using
Me.Write_Log("Succesfully Exported")
Catch ex As Exception
Me.Write_Log("Write Error during export")
End Try
End Sub
最佳答案
Encoding.ASCII
用于标准 7 位 ASCII 编码,根本不包含度数符号。为了获得 ASCII 形式的度数符号,您必须使用多种 8 位 ASCII 编码之一。对于英语,您可能对使用 ISO 8859-1 代码页最感兴趣,因为这是其中最标准的一个。例如,您可以执行以下操作,而不是使用 Encoding.ASCII
:
Using OutFile As New StreamWriter(fName, False, Text.Encoding.GetEncoding("iso-8859-1"))
OutFile.Write(txt)
End Using
有关可用编码的完整列表,请使用 Encoding.GetEncodings
方法,或查看 MSDN documentation 中支持的编码列表。 .
当然,各种 8 位 ASCII 编码都不相互兼容,因此,如果您确实使用它,则在使用不同代码页的系统上查看时,度数符号将是完全不同的符号默认。这正是 UTF-8 成为新标准的原因。人们普遍不鼓励使用 8 位 ASCII,因为它在多文化场景中实际上不可行。如果你可以使用 UTF-8 代替,我会的。如果必须使用 ASCII,最好坚持使用标准 7 位编码。如果您必须使用 8 位 ASCII 编码,请谨慎使用,并充分认识到其缺点。
还有一件事。您提到度数符号是所需目标编码中的字符 167 (0xA7)。如果是这种情况,您实际上可能需要 IBM437 编码而不是 ISO 8859-1。 IBM437 是 MS-DOS 中默认使用的旧代码页。如果您确实需要使用该代码页,则可能会因两个原因而遇到额外的麻烦。正如您将在 MSDN 文章中看到的那样,.NET 框架并未很好地支持该代码页。在我的测试中,使用该编码输出包含度数符号的 Unicode 字符串无法正常工作。因此,您可能会发现自己需要使用字节数组来表示数据,而不是 String
变量(这是 Unicode)。例如:
File.WriteAllBytes("Test.txt", {167})
第二个问题是 IBM437 可能不是 Windows 操作系统的默认代码页,因此即使将其作为字节值 167 写入文件,当您在Windows 应用程序,例如记事本。
关于vb.net - 保存带有度数符号和 ASCII 编码的 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27821107/