2017-09-18 30 views
0

过时Uri(string, bool)构造用于从已经转义字符串构造一个URI(如果无效字符串被呈现过时想必不打破程序)。但是,我发现自己处于需要通过URI传递字面字节的情况,并且我想不出一种更好的方式来编码它们。用什么来代替dontReplace来构造一个数据URI?

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

因为我几乎没有别的选择,只能让.NET为我编码字符串,而不必使用过时的构造函数,并且没有构造函数(应该有,在我看来),我是什么构造URI的选项?

我想过使用Encoding.GetEncoding(1252)创建从字节的串,并使用,作为CP1252可以解码任何字符,但似乎内部乌里编码方法使用UTF-8来编码的字符,所以我不根本不可能使用文本编码。

我有什么选择?如果没有其他方法,继续使用过时的构造函数可以吗?

回答

0

好,标准乌里构造函数接收预编码的URI,并且不替换有效%字符,所以使用来自含有一个有效的URI字符串构建乌里dontReplace参数是不是真的有必要编码部分。他们不会被重新编码。

0

存在一些情况,当该URI是不BASE64短,例如,当有较少的二进制数据

URI是不每次的base64短,因为BASE64从故意有限字符集产生文本来自八位字节。

的时间的base64可以不使用是当数据是文本。否则结果将是胡言乱语。

为CP1252可以解码任何字符

不,它可以编码只有251个字符不像说UTF-8可在UCS中的每个字符进行编码。 UTF-8不能字节的每个序列进行解码,而一些不正确的CP-1252实现填写CP-1252的间隙(如0×81)的东西,但即使你可以取决于(你不能),这是不理智的因为你正在构建一个字符串,所以编码问题并不重要,除了任何%转义字符,并且它们总是会根据它们在UTF-8中的编码进行转义。 (很久以前的URL [术语URI目前还不存在]可以根据其他编码进行转义,但这并不奏效,因为没有办法知道使用了什么编码,因此标准要求使用UTF -8自1998年以来)。

是不是好继续使用过时的构造

不,它产生的结果越野车。

URI是建立在文本的顶部。如果你的数据是文本的,那么只需通过正常的URI规则对它进行编码,通过Uri.EscapeDataString()。如果你的数据不是文本的,那么使用base-64将它编码为文本,然后从那里开始。不要尝试将某些URI放入URI中没有意义的URI中。

+0

数据URI在1998 RFC中定义,根据规范,可以指定charset来正确解释数据。因为这个原因,'data:text/plain; charset = windows-1250,%A9'显示©符号,但是data:text/plain; charset = utf-8,%A9'没有。数据是基于类型和字符集解释的,而不是基于UTF-8的。数据可能不完全是文本的,只是大多数文本与中间有一些二进制数据,这仍然会使base64效率低下。 – IllidanS4

+0

是的,事实上它与RFC使UTF-8成为在URI中转义工作的基础一样。 –

相关问题