【问题标题】:String Encoding Issue字符串编码问题
【发布时间】:2010-01-20 21:57:54
【问题描述】:

我在字符串存储在数据库中的方式上遇到了一个非常奇怪的问题,因此,我在 Javascript 中遇到了这些“未终止的字符串文字”错误。

以下是我正在做的事情的概述:

平台:C#/ASP.NET MVC 1.0、SQL Server 2005、SparkViewEngine、YUI 2

在我看来,我使用 NewtonSoft 的 Json.NET 将对象序列化为 JSON 数据结构。

<script type="text/javascript">
    // <![CDATA[ 
    var data = YAHOO.lang.JSON.parse("${Newtonsoft.Json.JsonConvert.Serialize(Model)}");
    ....
</script>

通常,这是可行的,但我注意到我从数据库中提取的字段之一包含以下数据,这导致字符串无法正确形成。

数据库字段是NVARCHAR(2000)

对于某些条目,当我从数据库复制并粘贴到记事本时,我会在字符串中得到这些奇怪的字符。

编译?分析?&?建议?甲板

在 Firebug 中,它显示为一堆换行符:

Analysis & Recommendations deck","StartDate":"1/19/10","FinishDate":"1/26/10","Duration":6.0,"

编译分析和建议套牌

更新 与用户交谈后,我发现他们正在使用从 word 文档复制和粘贴到 HTML 表单。

表单本身使用 YUI 连接管理器进行异步 POST 调用 (AJAX) 以保存表单值。 数据库保存了表单字段值以及与之关联的任何编码。

Word 中似乎有些字符是可打印的,但不是 ASCII。有什么方法可以检测到这一点并正确编码?

【问题讨论】:

    标签: sql-server asp.net-mvc spark-view-engine


    【解决方案1】:

    这似乎是您没有正确处理引号字符的情况。你有几种方法可以走。我为我们的网站使用 cmets 的方式是确保所有引号都经过编码,包括单引号和双引号,这样您的 SQL、ASPX 和 Javascript 都不会出现问题。 我们的方法是针对客户评论字段,因此我们在转换方面做得太过火了。

    Function SafeComment(ByVal strInput)
    ' Renders Any Comment Codes Harmless And Leaves Them HTML readable In An eMail Or Web Page
    ' Try: SafeComment("`~!@#$%^&*()_+=-{}][|\'"";:<>?/.,")
        SafeComment = ""
        If Len(strInput) = 0 Then Exit Function
        SafeComment =   Replace(Replace(Replace( _
                        Replace(Replace(Replace( _
                        Replace(Replace(Replace( _
                        Replace(Replace(Replace( _
                            Server.HtmlEncode(Trim(strInput)), _
                        "-", "&#45;"), ":", "&#58;"), "|", "&#124;"), _
                        "`", "&#96;"), "(", "&#40;"), ")", "&#41;"), _
                        "%", "&#37;"), "^", "&#94;"), """", "&#34;"), _
                        "/", "&#47;"), "*", "&#42;"), "'", "&#39;")
    End Function
    

    它不漂亮,但它可以完成工作。

    【讨论】:

    • 谢谢。我认为问题在于用户复制并粘贴了不可打印的 ASCII 字符。
    • 在这种情况下,我们将 unicode 字符作为 Ascii,然后将生成的 8 位字符映射到适当的 7 位可打印 ascii 字符。
    • 更准确地说,用户将文本从 Word 文档复制到表单上。我不确定粘贴了哪些字符,但它们导致字符串无法正确终止;您提到的解决方案是否适用于此类情况?再次感谢!
    • 对于这种类型的事情,我们使用了一个函数,将 x20 到 x7e 范围内的所有字符映射到 x20 到 x7e 范围内。那一个更糟糕。我创建了一个字符值数组。代码对字符执行 ASC() 并转到数组中的该位置以创建输出字符。我们必须这样做,因为 MS-Dynamics 数据映射不会接受超出该范围的任何字符。任何未映射的字符都会被忽略。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 2012-02-22
    • 2019-11-17
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    相关资源
    最近更新 更多