c# - 未指定名称字段的编码,任何非 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
构建TarInputStream
and时我应该指定什么TarOutputStream
?
解决方案
您指定的编码取决于文件的内容,并取决于您在场景中尝试实现\支持的内容。
由于默认值似乎是 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
推荐阅读
- php - 文档已移动 - Android Studio
- java - 在杰克逊中使用@JsonCreator 进行反序列化时,是否可以确定要构造的类型?
- javascript - 如果从某个 html 文件接近,是否有一种简单的方法可以只执行 if 语句?
- html - 在图形标签内使用标签是否正确?
- amazon-web-services - 在 S3 上创建文件文件夹
- android - 对齐卡片内的搜索图标和文本
- mysql - MySQL 服务器在没有更改后消失了
- nlog - 在自定义目标中重用 NLogs FileTargets FilePathLayout 功能
- vb6 - 来自 Interop 对象的 VB6 内存泄漏
- c# - 使用 MS-Graph API 搜索特定邮件时出现问题