C# 在插入SQL Server数据库之前,从ASP.NET Webform的哈希表转换UTF-8编码数据

C# 在插入SQL Server数据库之前,从ASP.NET Webform的哈希表转换UTF-8编码数据,c#,asp.net,sql-server,utf-8,webforms,C#,Asp.net,Sql Server,Utf 8,Webforms,我的工作内容: 在我的Asp.net Webforms应用程序中,我从用户获取表单数据,然后将该数据插入SQL Server数据库。每个键是表单中字段的标识符,值是用户接收的数据 我的问题: 我的问题是,用户正在将电子邮件等中的UTF-8数据复制和粘贴到“备注”字段中。SQL Server数据库无法将UTF-8识别为有效的字符数据。相反,它同时使用UCS-2和ISO-8859-1字符集。因此,这些字符集将作为问号(?)插入到数据库中。因此,我想正确地将任何UTF-8字符转换为UCS-2或ISO-

我的工作内容:
在我的Asp.net Webforms应用程序中,我从用户获取表单数据,然后将该数据插入SQL Server数据库。每个键是表单中字段的标识符,值是用户接收的数据

我的问题:
我的问题是,用户正在将电子邮件等中的UTF-8数据复制和粘贴到“备注”字段中。SQL Server数据库无法将UTF-8识别为有效的字符数据。相反,它同时使用UCS-2和ISO-8859-1字符集。因此,这些字符集将作为问号(?)插入到数据库中。因此,我想正确地将任何UTF-8字符转换为UCS-2或ISO-8859-1

问题:

  • 我应该将UTF-8字符转换为UCS-2还是ISO-8859-1
  • 在ASP.NET web表单中,确定哈希表“notes”键值中使用的字符集的最佳方法是什么
  • 将UTF-8字符转换为可接受字符集的最佳方法是什么

  • 选项1:使用nvarchar

    您可以将字段从varchar更改为nvarchar,以便正确存储unicode字符。这就是问题所在。很酷。使用它

    选项2:智能转换。

    如果您有一个传统的数据库,nvarchar根本无法工作,那么您可以创建一个字符串扩展,让您存储用户提供的ascii版本的值。下面是一个这样的扩展(请注意,在删除所有非ascii字符之前,我们正在对“智能”引号/etc进行一些初始替换)

    如果你支持国际(口音,等等),那么这有点文化上的不敏感(“呸-远离你疯狂的口音标记和奇怪的非英语字母”)

    公共静态类StringExt{
    静态公共字符串TRYGETASCISTRING(此字符串为原始字符串){
    //将这些msword“智能”字符替换为ascii(哑)字符。
    字符串转义=System.Convert.ToString(p\u字符串.Replace('\u2013','-')。Replace('\u2014','-')。Replace('\u2015','-')。Replace('\u2017','.'''\u2018','\'')。Replace('\u2019','\'')。Replace('\u201a',','-')。Replace('\u201b','\'''''.'''''-')。Replace('\u201c','''''''.\)。Replace('\u201d',''.'''''''.'''''.\'.Replace('.Replace('\u201d',''.Replace('\u201d','.''''''.Replace('.Replace('.''.Replace(('\u2032','\''。替换('\u2033','\'');
    //正则表达式将输出所有其他非ascii字符。
    expected=Regex.Replace(p\u sVal,“[^A-Za-z 0-9\,\?\”!@\\\$%\^&*\(\\)-:\/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;
    //一切就绪。。
    返回逃逸;
    }
    }
    
    选项…错误…2A?:放弃前30个ascii码(给予或接受)


    我注意到,当用户从MAC word(和其他一些程序)复制/粘贴时,粘贴的数据在前30个ascii字符中包含字符。除了9、10和13…您可能可以丢弃这些字符(它们只是NUL的ACK的DC和其他一些用户实际上不会键入的垃圾)。

    选项1:使用nvarchar

    你可以把你的字段从varchar改为nvarchar,这样你的unicode字符就可以正确存储了。这很酷。使用它吧

    选项2:智能转换。

    如果您有一个传统的数据库,nvarchar根本无法工作,那么您可以创建一个字符串扩展名,用于存储用户提供的ascii版本的值。下面是一个这样的扩展名(请注意,在删除所有非ascii字符之前,我们正在对“智能”引号/etc进行一些初始替换)

    如果你支持国际(口音,等等),那么这有点文化上的不敏感(“呸-远离你疯狂的口音标记和奇怪的非英语字母”)

    公共静态类StringExt{
    静态公共字符串TRYGETASCISTRING(此字符串为原始字符串){
    //将这些msword“智能”字符替换为ascii(哑)字符。
    字符串转义=System.Convert.ToString(p\u字符串.Replace('\u2013','-')。Replace('\u2014','-')。Replace('\u2015','-')。Replace('\u2017','.'''\u2018','\'')。Replace('\u2019','\'')。Replace('\u201a',','-')。Replace('\u201b','\'''''.'''''-')。Replace('\u201c','''''''.\)。Replace('\u201d',''.'''''''.'''''.\'.Replace('.Replace('\u201d',''.Replace('\u201d','.''''''.Replace('.Replace('.''.Replace(('\u2032','\''。替换('\u2033','\'');
    //正则表达式将输出所有其他非ascii字符。
    expected=Regex.Replace(p\u sVal,“[^A-Za-z 0-9\,\?\”!@\\\$%\^&*\(\\)-:\/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;
    //一切就绪。。
    返回逃逸;
    }
    }
    
    选项…错误…2A?:放弃前30个ascii码(给予或接受)


    我注意到,当用户从MAC word(和其他一些程序)复制/粘贴时,粘贴的数据在前30个ascii字符中包含字符。除了9、10和13之外……您可能可以丢弃这些字符(它们只是NUL的ACK的DC和其他一些用户不会实际键入的垃圾).

    您是在寻找将其转换为ascii的方法,以便将其保存到文本字段中,还是希望将数据“粘贴”保存?您是在寻找将其转换为ascii的方法,以便将其保存到文本字段中,还是希望将数据“粘贴”保存?
    public static class StringExt {
        static public string TryGetAsciiString(this string original) {
    
            //Replace those msword "smart" characters with ascii (dumb) characters.
            string escaped = System.Convert.ToString(p_String.Replace('\u2013', '-').Replace('\u2014', '-').Replace('\u2015', '-').Replace('\u2017', '_').Replace('\u2018', '\'').Replace('\u2019', '\'').Replace('\u201a', ',').Replace('\u201b', '\'').Replace('\u201c', '\"').Replace('\u201d', '\"').Replace('\u201e', '\"').Replace("\u2026", "...").Replace('\u2032', '\'').Replace('\u2033', '\"'));
            //regex out all those other non-ascii characters.
            escaped = Regex.Replace(p_sVal, "[^A-Za-z 0-9 \\.,\\?\'\"!@#\\$%\\^&\\*\\(\\)-_=\\+;:<>\\/\\\\\\|\\}\\{\\[\\]`~\\n\\r]*", "");
            //All set..
            return escaped;
        }
    }