2017-10-27 9 views
0

다른 사용자에게 전송하기 위해 vb.net (프레임 워크 버전 3.5)을 사용하여 zip 폴더의 csv 파일로 SQL Server 데이터베이스의 데이터를 내보내려고합니다. 필드의 데이터에 유로 기호가 포함되어 있거나 웹 페이지의 텍스트 필드에 붙여 넣은 경우를 제외하고 모두 올바르게 작동합니다. 그런 다음 출력 CSV는 CSV 파서 (Excel 포함)에서 줄 바꿈을하는 null 문자를 포함하는 것 같습니다. 거기에 있어서는 안되는 줄 바꿈 (필자는 여러 줄을 큰 따옴표로 묶었습니다).vb.net encoding.unicode.getbytes issue

나는 Encoding.Unicode.GetBytes를 화나게하는 텍스트의 특정 문자를 추적하여 null 문자로 바꿉니다. 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 메소드를 작동 시키려면 무엇을 놓치고 있는지 말해 줄 수 있습니까?

도움을 주시면 감사하겠습니다.

+0

가 Encoding.Unicode으로 인코딩 된 가정하지 않습니다 CSV 파일을 수용 할 수있는 프로그램입니다. 파일에 BOM이있는 경우 * 유니 코드 인코딩 (Encoding.UTF8 먼저)을 처리 할 수 ​​있습니다. 대신 StreamWriter를 사용하여 BOM을보다 잘 제어 할 수 있습니다. 즉시 .zip 파일을 만들려고하면이 문제가 발생합니다. –

+0

바이트 배열을 사용하고있는 것에 관계없이 해당 문자가 포함 된 필드를 바이트 배열로 변환하려고해도 같은 결과가 발생하지 않습니까? 어쩌면 문제는 해당 문자가 들어있는 문자열을 바이트 배열로 변환하는 방법일까요? – user8843348

+0

문제는 유니 코드가 2 바이트 인코딩이므로 수신자가 예상하지 않는 한 각 문자의 두 번째 바이트 (0이 됨)는 NULL 문자라고 가정합니다. UTF8은 다양한 문자 코드에 대해 다른 바이트 길이를 사용하여이를 해결합니다. StreamWriter를 사용하는 경우 UTF8이라는 대부분의 정보를 나타내는 유니 코드 BOM (Byte Order Mark)을 발행하게 할 수 있습니다. – 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) 

다시 한번 감사