繁体   English   中英

使用StreamWriter的C#脚本会创建额外的字符吗?

[英]C# Script Using StreamWriter Creates Extra Character?

我在SSIS中使用C#脚本任务来输出ASCII字符。 我这样做是因为我正在创建一个带有打包字段的文件,打包字段使用称为二进制编码十进制的表示法将两个数字带入每个字节。

因此,我发现输出带有Œ(0x8C)[Dec 140]的NUL(0x00)[Dec 0]时,会在它们之间添加一个额外的字符Â(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);
}

输出如下:

额外字符

更新我没有指出的一件事是,我将十六进制值传递到C#脚本中,然后将十六进制值表示的字符写入具有固定长度列的文件中。

我不知道这是否有区别,但是我还将向文件中写入其他内容,这些内容不是与打包值在同一行上的打包值,因此也不是使用StreamWriter的原因。

StreamWriter用于将文本写入流。 它始终使用一种编码,如果在创建时未指定编码,它将使用UTF-8(无字节顺序标记-BOM)。 您得到的输出是UTF-8编码器,它试图将文本(以单个字符的形式)转换为UTF-8。

如果要向流中写入字节 ,只需使用接受字节数组的Write方法直接将其Write流。 如果要写入文件,则可以创建FileStream并将其用作流。

有时, System.IO名称空间中类的命名可能会造成混淆:

  • Stream是一个抽象的基类,提供读取和写入字节的方法
  • FileStream是读取和写入文件的Stream
  • BinaryWriter允许您以二进制形式将原始类型写入Stream
  • TextWriter是一个抽象基类,可让您编写文本
  • StreamWriter是一个TextWriter ,允许您将文本写入Stream

你或许应该使用FileStreamBinaryWriter上的顶部FileStream为您解决问题。

这是一个编码问题。 如果您写* byte * s,就不会发生。

BinaryWriter writer = new BinaryWriter(someStream);
write.Write((byte)123); // just an example! not a "that's how you should do it"

更好的解决方案是选择适当的编码。 但是,字符在文件中的显示方式真的重要吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM