2017-09-18 63 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中轉義工作的基礎一樣。 –

相關問題