【问题标题】:vb.net encoding.unicode.getbytes issuevb.net encoding.unicode.getbytes 问题
【发布时间】:2017-10-27 12:04:52
【问题描述】:

我正在尝试使用 vb.net(框架版本 3.5)将数据从 SQL Server 数据库导出到压缩文件夹中的 csv 文件,以便传输给其他用户。一切正常,除非字段中的数据包含欧元符号或将其从网页粘贴到文本字段中 - 然后输出 csv 似乎包含空字符,这些字符会抛出 csv 解析器(包括 Excel)导致行不应该存在的中断(我已将任何包含多行的字段用双引号括起来)。

我已将其追溯到文本中似乎使 Encoding.Unicode.GetBytes 不安的某些字符 - 它用空字符替换它们。如果我使用 Encoding.Default.GetBytes 可以正常工作,但是我会冒发送方和接收方使用不同代码页的风险,并且接收方可能无法导入数据。

正如我所提到的,问题字符之一是欧元符号 (chr(128)),其他字符包括 chr(130 到 140) 和 chr(145 到 156)。

所以我现在拥有的是:

 Dim b() As Byte = Text.Encoding.Default.GetBytes(itm.ItemText)

 pkgpart.GetStream().Write(b, 0, b.Length)

可行,但首选:

 Dim b() As Byte = Text.Encoding.Unicode.GetBytes(itm.ItemText)

 pkgpart.GetStream().Write(b, 0, b.Length)

没有。

谁能告诉我为了让 Unicode.Getbytes 方法工作我缺少什么?

任何帮助将不胜感激。

【问题讨论】:

  • 任何可以接受 CSV 文件的程序都不会假定它是用 Encoding.Unicode 编码的。如果文件有 BOM,它可能能够处理 Unicode 编码(首先是 Encoding.UTF8)。通过使用 StreamWriter 来获得成功,这样您就可以更好地控制 BOM。试图立即创建一个 .zip 文件会让您陷入困境。
  • 但是,如果我尝试将包含这些字符的任何字段转换为字节数组,无论我使用字节数组做什么,都会发生同样的事情吗?也许问题应该是有没有办法将包含相关字符的字符串转换为字节数组?
  • 问题在于 Unicode 是一个 2 字节的编码,除非接收者期望这样,否则它将假定每个字符的第 2 个字节(将为 0)是 NULL 字符。 UTF8 通过为各种字符代码设置不同的字节长度来解决这个问题。如果你使用 StreamWriter,你可以让它发出 Unicode BOM(字节顺序标记),它会告诉大多数事情它是 UTF8。
  • @user8843348 请将您的更新从问题中移到答案中。一旦你认为这是最好的答案,就接受它。

标签: vb.net csv unicode encoding


【解决方案1】:

感谢 Hans 和 dwilliss 让我走上正轨。如下添加 BOM 并使用 UTF-8 可以正常工作。

Dim b() As Byte = Text.Encoding.UTF8.GetPreamble.Concat(Text.Encoding.UTF8.GetBytes(itm.ItemText)).ToArray
pkgpart.GetStream().Write(b, 0, b.Length)

再次感谢

【讨论】:

    猜你喜欢
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多