保存带有度数符号和 ASCII 编码的 CSV 文件
Saving CSV file with degree symbol and ASCII encoded
我有字符串变量 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.
中支持的编码列表
当然,none 的各种 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 OS 的默认代码页,因此即使将它作为字节值 167 写入文件,它实际上也不会在 windows 应用程序(如记事本)中查看时,它看起来像度数符号。
我有字符串变量 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.
当然,none 的各种 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 OS 的默认代码页,因此即使将它作为字节值 167 写入文件,它实际上也不会在 windows 应用程序(如记事本)中查看时,它看起来像度数符号。