2

我有字符串变量 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
4

1 回答 1

3

Encoding.ASCII用于标准的 7 位 ASCII 编码,它根本不包含度数符号。为了获得 ASCII 中的度数符号,您必须使用许多 8 位 ASCII 编码之一。对于英语,您可能对使用 ISO 8859-1 代码页最感兴趣,因为这是其中最标准的代码页。例如Encoding.ASCII,您可以执行以下操作,而不是 using :

Using OutFile As New StreamWriter(fName, False, Text.Encoding.GetEncoding("iso-8859-1"))
    OutFile.Write(txt)
End Using

有关可用编码的完整列表,请使用该方法,或查看MSDN 文档Encoding.GetEncodings中支持的列表。

当然,各种 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 应用程序中查看它时,它实际上也不会看起来像度数符号比如记事本。

于 2015-01-07T14:24:16.860 回答