在插入到 SQL Server 数据库之前,从 Web 表单的哈希表中转换 UTF-8 编码 ASP.NET 数据



我正在使用什么:
在我的 Asp.net WebForms 应用程序中,我从用户那里获取表单数据,然后将该数据插入到 SQL Server 数据库中。每个键都是表单中字段的标识符,值是用户接收的数据。

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

问题:

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

选项 1:使用 nvarchar

您可以将字段从 varchar 更改为 nvarchar,以便正确存储 unicode 字符。 这就是 nvarchar 数据类型的重点。 很酷。 使用它。

选项2:智能转换。

如果你有一个遗留的数据库,其中 nvarchar 根本不起作用,那么你可以创建一个字符串扩展,让你存储来自用户的值的 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;
    }
}

选择。。。犯 错。。。2A?:放弃前 30 个 ascii 代码(给予或接受)

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

最新更新