我在SSIS中使用C#脚本任务输出ASCII字符。我这样做是因为我正在使用Packed字段创建一个文件,一个压缩字段在每个字节中使用两位数字,使用称为二进制编码十进制的符号。
所以,我发现当输出NUL(0x00)[Dec 0]和Œ(0x8C)[Dec 140]时,它会在它们之间增加一个额外的字符(0xC2)。我无法弄清楚为什么会这样。有没有人有任何想法?请参阅下面的代码:
string fileName;
System.IO.StreamWriter writer;
public override void PreExecute()
{
base.PreExecute();
this.fileName = this.Variables.FilePath;
}
public override void PostExecute()
{
base.PostExecute();
writer.Flush();
writer.Close();
}
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
writer.Write((char)00);
writer.Write((char)140);
writer.Write((char)13);
writer.Write((char)10);
}
以下输出:
更新 我没注意的一件事是我将Hex值传递给C#脚本,然后将十六进制值表示的字符写入具有固定长度列的文件。
我不知道这是否有所作为,但我也会在文件中写入其他内容,这些内容与打包值在同一行上不是打包值,因此也就是使用StreamWriter的原因。
答案 0 :(得分:3)
StreamWriter
用于将文字写入流。它总是使用编码,如果你在创建它时没有指定它,它将使用UTF-8(没有字节顺序标记 - BOM)。你得到的输出是UTF-8编码器试图将文本(以单个字符的形式)翻译成UTF-8。
如果要将 bytes 写入流,只需使用接受字节数组的Write
方法直接写入流。如果要写入文件,可以创建FileStream
并将其用作流。
System.IO
命名空间中的类的命名有时会令人困惑:
Stream
是一个抽象基类,提供读写字节的方法FileStream
是一个Stream
,可以读取和写入文件BinaryWriter
允许您将二进制形式的基本类型写入Stream
TextWriter
是一个允许您编写文本的抽象基类StreamWriter
是一个TextWriter
,可让您将文字写入Stream
您可能应该在FileStream
之上使用BinaryWriter
或FileStream
来解决您的问题。
答案 1 :(得分:1)
您必须未指定作者的正确编码。
请参阅:http://msdn.microsoft.com/en-us/library/72d9f8d5.aspx
和:http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx
答案 2 :(得分:1)
这是一个编码问题。 如果你写* byte * s就不会发生。
BinaryWriter writer = new BinaryWriter(someStream);
write.Write((byte)123); // just an example! not a "that's how you should do it"
更好的解决方案是选择正确的编码。但是你的角色在文件中看起来的方式真的很重要吗?