2017-10-27 3 views
0

私はSQL Serverデータベースからvb.net(フレームワークバージョン3.5)を使用してzipフォルダのcsvファイルにデータをエクスポートして、他のユーザーに送信しようとしています。フィールドのデータにユーロ記号が含まれているか、Webページからテキストフィールドにペーストされている場合を除いて、すべて正常に動作します - 出力csvには、csvパーサー(Excelを含む)を捨てるヌル文字が含まれているようですそこにあってはならない区切り(私は二重引用符で複数の行で任意のフィールドを囲んだ)。vb.net encoding.unicode.getbytes issue

私は、Encoding.Unicode.GetBytesを怒らせるようなテキストの特定の文字まで追跡しました。それらは、null文字で置き換えられます。 Encoding.Default.GetBytesを使用すると問題なく動作しますが、別のコードページを使用する送信者と受信者のリスクと、受信者がデータをインポートできない可能性があります。

前述したように、問題の文字の1つはユーロ記号(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メソッドを動作させるために、私が何が欠けているのか教えていただけますか?

ご協力いただければ幸いです。

+0

それはEncoding.Unicodeでエンコードされたと仮定することはありませんCSVファイルを受け入れることができ、任意のプログラム。ファイルにBOMがある場合、Unicodeエンコーディング(Encoding.UTF8ファースト)を処理できる可能性があります。代わりにStreamWriterを使用して、BOMをよりよく制御できるようにしてください。瞬時に.zipファイルを作成しようとすると、この問題が発生しました。 –

+0

バイト配列を使用しているかどうかにかかわらず、それらの文字を持つフィールドをバイト配列に変換しようとすると、同じことは起こりませんか?問題の文字を含む文字列をバイト配列に変換する方法はあるのでしょうか? – user8843348

+0

問題は、Unicodeが2バイトのエンコーディングであり、受信者がそれを期待しない限り、各文字の2番目のバイト(0になる)はNULL文字であると想定します。 UTF8は、さまざまな文字コードに対して異なるバイト長を使用することによって、その周りにあります。 StreamWriterを使用する場合、Unicode BOM(Byte Order Mark)を発行して、UTF8であることをほとんどのものに伝えることができます。 – dwilliss

答えて

0

私は正しいトラックに私を置くためにハンスと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) 

おかげで再び