我有字符串变量txt。它包含“°”度符号。我想将字符串保存为ASCII文件ASCII编码。我使用下面的过程但是“°”符号被转换为“?”。你知道如何正确保存度数符号吗?
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
答案 0 :(得分:3)
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应用程序,如记事本。