使用什么代替 dontReplace 来构建数据 URI?

What to use instead of dontReplace for constructing a data URI?

过时的 Uri(string, bool) 构造函数用于从已经转义的字符串构造 URI(如果出现无效字符串,过时的可能不会破坏程序)。但是,我发现自己处于需要通过 URI 传递文字字节的情况,而且我想不出更好的编码方式。

我正在构建一个 data: URI,这是一种传递整个资源而不是其标识符的标准化方法。尽管我知道它有一个 ;base64 说明符来将传递的数据标记为以 base64 编码,但在某些情况下 URI 较短而没有 base64,例如当二进制数据较少时。因为我不想担心编码问题,所以我只想将字节与 URI 作为 URI 编码字符串一起传递,使用 HttpUtility.UrlEncode(byte[]).

因为我别无选择,只能让 .NET 为我编码字符串,而不必使用过时的构造函数,并且没有 Uri(byte[]) 构造函数(我认为应该有),我有哪些构建 URI 的选项?

我考虑过使用 Encoding.GetEncoding(1252) 从字节创建一个字符串并使用它,因为 cp1252 可以解码任何字符,但似乎内部 Uri 编码方法使用 UTF-8 对字符进行编码,所以我发现根本不可能使用文本编码。

我有哪些选择?如果没有其他办法,继续使用过时的构造函数是否可以?

there are situations when the URI is shorter without base64, for example when there are less binary data

如果没有 base64,URI 每次都更短,因为 base64 从八位字节中故意限制的字符库中生成文本。

当数据是文本时,不能使用时间base64。否则结果将是乱码。

as cp1252 can decode any character

不,它只能编码 251 个字符,不像 UTF-8 可以编码 UCS 中的每个字符。 UTF-8 无法解码每个字节序列,而一些不正确的 CP-1252 实现用某些东西填补了 CP-1252 中的空白(例如 0x81),但即使你可以依赖它(你不能)这也是不明智的因为您正在构建一个字符串,所以编码问题并不重要,除了任何 % 转义字符,它们将始终根据它们在 UTF-8 中的编码进行转义。 (很久以前,URL [术语 URI 还不存在] 可以根据其他编码进行转义,但这没有用,因为没有办法知道编码有什么已被使用,因此标准自 1998 年起强制使用 UTF-8)。

Is it okay to continue using the obsolete constructor

不,它会产生错误的结果。

URI 建立在文本之上。如果您的数据是文本数据,则只需通过 Uri.EscapeDataString() 按照正常的 URI 规则对其进行编码。如果您的数据不是文本,则使用 base-64 将其编码为文本,然后从那里开始。不要试图在 URI 中放入一些在 URI 中没有意义的内容。

嗯,标准 Uri 构造函数接受预编码的 URI,并且不会替换有效的 % 字符,因此使用 dontReplace[当从包含编码部分的有效 URI 字符串构造 Uri 时,=16=] 参数并不是真正必需的。它们不会被重新编码。