2017-06-29 17 views
0

任何人都知道如何在C#中編碼ISO-8859-2字符集?下面的例子不工作:HTML在C#中編碼ISO-8859-2(Latin-2)字符

 String name = "Filipović"; 
     String encoded = WebUtility.HtmlEncode(name); 

結果字符串應該是

"Filipović" 

感謝

+0

只是愛問......爲什麼?您是否使用ISO-8859-2爲客戶提供文件?如果您以UTF-8格式提供它們,則不必擔心諸如ć的html編碼字符。 – Culme

+0

將用戶輸入存儲到數據庫中時,'ć'等字符在沒有編碼的情況下被存儲爲'c' – reeax

+0

我知道我現在可能沒有幫助,但聽起來您應該真的嘗試更改數據庫列的數據類型在其中存儲名稱。你有選擇更改數據庫嗎? – Culme

回答

1

如果你沒有對HTML編碼我嚴格要求d推薦使用編碼所有非ASCII字符的Url(%)編碼:

String name = "Filipović"; 
String encoded = WebUtility.UrlEncode(name); // Filipovi%C4%87 

如果您必須將包含所有非ASCII字符的字符串始終用HTML編碼,則最佳方法是使用&xNNNN;&#NNNN;format對127以上的所有字符進行編碼。不幸的是,無法容易地使用HtmlEncode對所有字符進行編碼,因此您需要自己動手做,也就是在Convert a Unicode string to an escaped ASCII string中做的。你可以繼續使用HtmlDecode來讀取它的值,它處理&#xNNNN就好了。

非最佳樣本:

var name = "Filipović"; 
    var result = String.Join("", 
    name.Select(x => x < 127 ? x.ToString() : String.Format("&#x{0:X4}", (int)x)) 
); 
+0

你好@Alexei感謝小費,它看起來非常有趣,我會嘗試一下。 – reeax

+0

你的「非最優」樣本效果很好,字母確實是編碼的,並且使用HtmlDecode很容易解碼。 – reeax

1

閱讀您的意見(你應該只支持使用ASCII字符也是中國人的名字),我想你以後不應該堅持ISO-8859-2編碼。

溶液1個

使用UTF-7編碼爲這樣的名稱。 UTF-7被設計爲只對任何Unicode字符串使用ASCII字符。

string value = "Filipović with Unicode symbol: "; 
var encoded = Encoding.ASCII.GetString(Encoding.UTF7.GetBytes(value)); 
Console.WriteLine(encoded); // Filipovi+AQc- with Unicode symbol: +2Dzf7w- 
var decoded = Encoding.UTF7.GetString(Encoding.ASCII.GetBytes(encoded)); 

解決方案2

或者,你可以使用base64編碼,太。但在這種情況下,純ASCII字符串將不再是人類可讀的。

string value = "Filipović with Unicode symbol: "; 
encoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(value)); 
Console.WriteLine(encoded); // RmlsaXBvdmnEhyB3aXRoIFVuaWNvZGUgc3ltYm9sOiDwn4+v 
var decoded = Encoding.UTF8.GetString(Convert.FromBase64String(encoded)); 

解決方案3

如果你真的堅持到HTML實體編碼,你可以這樣實現它:

string value = "Filipović with Unicode symbol: "; 

var result = new StringBuilder();  
for (int i = 0; i < value.Length; i++) 
{ 
    if (Char.IsHighSurrogate(value[i])) 
    { 
     result.Append($"&#{Char.ConvertToUtf32(value[i], value[i + 1])};"); 
     i++; 
    } 
    else if (value[i] > 127) 
     result.Append($"&#{(int)value[i]};"); 
    else 
     result.Append(value[i]); 
} 

Console.WriteLine(result); // Filipovi&#263; with Unicode symbol: &#127983; 
+0

你好@taffer謝謝,基本上你說的是你可以使用UTF-7編碼任何語言的任何字符?有一些工作要更新現有的數據庫,但看起來很有趣。 – reeax

+1

是的,你可以。 UTF-7支持類似於任何其他UTF編碼的完整Unicode。 – taffer