vb.net - 保存带有度数符号和 ASCII 编码的 CSV 文件

标签 vb.net csv encoding streamwriter degrees

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

相关文章:

vb.net - LINQ-to-List 和 IEnumerable 问题

json - 配置单元 : How to explode a JSON column with an array, 并嵌入到 CSV 文件中?

java - 解码多次编码的字符串

python - 在 csv dictwriter 中将 dict 值从 unicode 转换为 utf-8(或 ascii)

c# - 如何从远程类调用未引用的方法? (允许 C# 和 VB.NET)

mysql - 从选择查询插入值数组 mysql vb.net

python - 查找名称中整数最大的文件名

JavascriptencodeURIComponent和Java解码问题

vb.net - vb.net 中的静态局部变量是否不适用于一次性对象?

python - Dask 读取 csv 与 pandas 读取 csv