0

我们使用以下组件开发我们的多语言网站:

MBCompresion - 我们使用该库的源文件来集成 JS/CSS 缩小和压缩。此外,我们编写了 HttpFilter,它将页面上的所有 JS / CSS 组合到一个请求中(一个用于 JS,一个用于 CSS)。我们使用 MBCompression 中的 FileSystemStorage 作为缓存策略。

jQueryUI Datepicker - 我们按原样使用它,包括本地化文件。

jQGrid - 同样,我们按原样使用它,包括本地化文件。

所有这一切都很好...... ASPX 页面上的“脚本”标签组合成单个“脚本”标签。它向 jslib.axd HttpHandler 发出请求,处理程序将所有 JS 文件合并为一个文件,用 GZip 压缩它,将压缩文件保存在 FileSystem 上,然后将该文件发送给客户端。

问题:唯一的问题是网站切换到中文时。当网站在中文时,使用 GZip 压缩和 FileSystem 缓存,到达客户端的 javascript 无效 - 它包含奇怪的字符和错误,如“Uncaught SyntaxError: Unexpected token ILLEGAL”。经过一番调查,我发现只有 jqGrid 和 jQuery Datepicker 的中文本地化文件存在问题。
这是到达客户端的 javascript 示例(只是一些行):

jQuery(function($){$.datepicker.regional['zh']={closeText:'s�',prevText:'<
Uncaught SyntaxError: Unexpected token ILLEGAL
',nextText:'>',currentText:'�)',monthNames:['','�','   ','�','�','m','','k',']','A','A','A�'],monthNamesShort:['','�','    ','�','�','m','','k',']','A','A','A�'],dayNames:['�','','�','   ','�','�','m'],dayNamesShort:['h�','h','h�','h  ','h�','h�','hm'],dayNamesMin:['�','','�',' ','�','�','m'],weekHeader:'h',dateFormat:'yy-mm-dd',firstDay:1,isRTL:false,showMonthAfterYear:true,yearSuffix:'t'};$.datepicker.setDefaults($.datepicker.regional['zh']);});

当我禁用 GZip 压缩时,一切正常。当我将缓存更改为 OutputCache 时,一切都可以...唯一的问题是,当我在中文上使用带有 FileSystemCache 的 GZip 时。所有其他语言(甚至日本人)都可以完美运行。

我什至不知道有什么问题。我认为它可能与Encoding或其他东西有关,但我在FileStream上没有看到将压缩JS写入文件的此类参数或属性。

请帮我解决这个问题。

谢谢。

4

1 回答 1

0

解决了!!!问题出在 Utils 类中的 MBCompression StringToBytes 方法中:

        /// <summary>
        /// Convert string to byte[]
        /// <para>Faster than the built-in method, and prevent encoding problems</para>
        /// </summary>
        /// <param name="stringValue"></param>
        /// <returns></returns>
        public static byte[] StringToBytes(string value)
        {
            int length = value.Length;
            byte[] resultBytes = new byte[length];
            for (int i = 0; i < length; i++)
            {
                resultBytes[i] = (byte)value[i];
            }
            return resultBytes;
        }

我将此方法更改为:

        /// <summary>
        /// Convert string to byte[]
        /// <para>Faster than the built-in method, and prevent encoding problems</para>
        /// </summary>
        /// <param name="stringValue"></param>
        /// <returns></returns>
        public static byte[] StringToBytes(string value)
        {
            Encoding Utf8 = Encoding.UTF8;
            return Utf8.GetBytes(value);
        }

现在看起来一切正常,包括中文。

于 2012-10-25T12:30:27.693 回答