不允许服务请求中的Unicode字符

问题描述:

我有一个SQL数据库不允许nvarchar,即unicode字符。 有没有一种方法可以让我在剩余服务(使用web api构建)上设置编码,以便在请求包含非ascii unicode字符时失败?不允许服务请求中的Unicode字符

+0

“Unicode字符”包含**所有可能的字符**。你必须对初学者更具体一些。另外,你使用的是什么平台/语言/框架? – deceze

+0

我想你是说你想限制发送到数据库的文本数据到数据库字符集支持的字符。你需要找出那是什么。要在SQL中执行此操作,请参阅[答案](http://stackoverflow.com/a/7321208/2226988)。 –

+0

你有你的答案@ newbie_86吗?如果不是,你能否给我们一个更新来告诉我们你的期望? – SandRock

您可以使用.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,它不会抛出异常并因性能原因调用回调。