首页 > 解决方案 > 未指定名称字段的编码,任何非 ASCII 字节都将被丢弃

问题描述

以下 .NET 5.0 代码使用ICSharpCode.SharpZipLib

var gzipInputStream = new GZipInputStream(sourceStream);
var tarInputStream = new TarInputStream(gzipInputStream);

var gZipOutputStream = new GZipOutputStream(destinationStream);
var tarOutputStream = new TarOutputStream(gZipOutputStream);

现在发出警告

[CS0618] 'TarInputStream.TarInputStream(Stream)' is obsolete: 
    'No Encoding for Name field is specified, any non-ASCII bytes will be discarded'

[CS0618] 'TarOutputStream.TarOutputStream(Stream)' is obsolete: 
    'No Encoding for Name field is specified, any non-ASCII bytes will be discarded'

Encoding构建TarInputStreamand时我应该指定什么TarOutputStream

标签: c#.net.net-coresharpziplib

解决方案


您指定的编码取决于文件的内容,并取决于您在场景中尝试实现\支持的内容。

由于默认值似乎是 ASCII,因此您现在实际上不需要更改\指定任何编码。

关于过时标志警告,如果您询问如何处理警告并保持默认编码,您可以使用TarOutputStream.TarOutputStream(Stream, null)ctor 方法签名。


更新(参考维护者的评论以及对 Github 问题的回复)

null指定in时条目编码过程的默认行为TarOutputStream.TarOutputStream(Stream, null)

无编码转换/仅 [复制] 低 8 位

关于指定编码的建议:

如果您不知道可能使用了什么编码,最安全的选择通常是指定 UTF-8

因此,我的建议与该建议相呼应。您调用非过时的构造函数并指定Encoding.UTF8.

var gzipInputStream = new GZipInputStream(sourceStream);
var tarInputStream = new TarInputStream(gzipInputStream, Encoding.UTF8);

var gZipOutputStream = new GZipOutputStream(destinationStream);
var tarOutputStream = new TarOutputStream(gZipOutputStream, Encoding.UTF8);

谢谢,@piksel bitworks 和 @Panagiotis Kanavos


推荐阅读