2015-04-06 23 views
0

回顧我的一些舊代碼,並想知道是否有更好的方法來創建一個字符串使用Unicode符號...UTF-8轉義序列串:肯定是一個更好的辦法

我有一個REST接口這需要某些轉義字符;例如,一個屬性叫做用戶名與約翰%foobar的+史密斯必須要求這樣的值:

{"username":"john\u0025foobar\u002bSmith"} 

我的C#方法來代替,如%某些字符和+是非常基本的:

public static string EncodeUTF8(string unescaped) { 
    string utf8_ampersand = @"\u0026"; 
    string utf8_percent = @"\u0025"; 
    string utf8_plus = @"\u002b"; 
    return unescaped.Replace("&", utf8_ampersand).Replace("+", utf8_plus).Replace("%", utf8_percent); 
} 

這似乎是一個過時的做法;當然,有一些使用Encoding的單行方法可以輸出字面UTF代碼,但是我找不到任何實質上不能替代像我這樣的語句的例子...有沒有更好的方法?

+1

這個問題沒有關於UTF8的內容。它是Unicode。 – xanatos

+0

不要這樣做。您應該使用JSON序列化程序。 – SLaks

+0

@SLaks你不需要在JSON中轉義+和% – xanatos

回答

1

你可以用正則表達式做到這一點:

static readonly Regex ReplacerRegex = new Regex("[&+%]"); 

public static string Replace(Match match) 
{ 
    // 4-digits hex of the matched char 
    return @"\u" + ((int)match.Value[0]).ToString("x4"); 
} 

public static string EncodeUTF8(string unescaped) 
{ 
    return ReplacerRegex.Replace(unescaped, Replace); 
} 

我不認爲它很(除非你有幾十取代了)。我認爲這會更慢,寫得更大。

+0

是的,這是更帥氣的代碼,但我同意它是過度的;我的版本一眼就能夠更容易理解,只是希望在我寫這三年的時候能夠使用一種更加流暢的本地方法 - 不要 - 不過 - 謝謝! – brnwdrng

+0

@brnwdrng唯一的好處是如果你有幾十個字符要替換:unicode代碼是自動計算的,所以你不必編寫它,並冒險寫錯了。 – xanatos

+0

這種方法的另一個優點(假設你使用字典來將匹配映射到替換而不是'String.Format'),它允許用一次傳遞替換具有不同值的字符。 –

相關問題