2016-01-22 56 views
0

我有一個SQL數據庫不允許nvarchar,即unicode字符。 有沒有一種方法可以讓我在剩餘服務(使用web api構建)上設置編碼,以便在請求包含非ascii unicode字符時失敗?不允許服務請求中的Unicode字符

+0

「Unicode字符」包含**所有可能的字符**。你必須對初學者更具體一些。另外,你使用的是什麼平臺/語言/框架? – deceze

+0

我想你是說你想限制發送到數據庫的文本數據到數據庫字符集支持的字符。你需要找出那是什麼。要在SQL中執行此操作,請參閱[答案](http://stackoverflow.com/a/7321208/2226988)。 –

+0

你有你的答案@ newbie_86嗎?如果不是,你能否給我們一個更新來告訴我們你的期望? – SandRock

回答

0

您可以使用.NET的內置編碼器來實現字符集驗證。

Encoding類可讓您訪問所有編碼。

每個Encoding實例允許從string轉換爲byte[],反之亦然方法GetBytes(string)GetString(byte[])

GetBytes方法用'?'替換不可轉換字符問號。您可以改變這種行爲來代替異常。

以下代碼檢查非ISO-8859-1字符,並在無效字符上引發異常。

[TestMethod] 
public void VerifyEncoding_UTF8CharsGiven() 
{ 
    var value = "hello ☃❆⛇✺⑳⑯✵ȳה"; 
    var encoding = Encoding.GetEncoding("iso-8859-1", EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback); 
    try 
    { 
     var bytes = encoding.GetBytes(value); 
     Assert.Fail("EncoderFallbackException should have occured"); 
    } 
    catch (EncoderFallbackException ex) 
    { 
     // Unable to translate Unicode character \u1F384 at index 6 to specified code page. 
     Debug.WriteLine(ex.Message); 
    } 
} 

這一個顯示成功的編碼匹配,因爲沒有發生異常。

[TestMethod] 
public void VerifyEncoding_CorrectCharsGiven() 
{ 
    var value = "hello my friends"; 
    var encoding = Encoding.GetEncoding("iso-8859-1", EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback); 
    var bytes = encoding.GetBytes(value); // no exception 
} 

您可以使用此代碼作出驗證屬性或按照您的要求進行驗證。您可能想要創建自己的DecoderFallback,它不會拋出異常並因性能原因調用回調。