0

次のコンポーネントを使用して多言語サイトを開発しています。

MBCompresion-そのライブラリのソースファイルを使用して、JS/CSSの縮小と圧縮を統合しました。さらに、ページ上のすべてのJS / CSSを1つのリクエスト(JS用に1つ、CSS用に1つ)に結合するHttpFilterを作成しました。キャッシュ戦略としてMBCompressionのFileSystemStorageを使用しています。

jQueryUI Datepicker-ローカリゼーションファイルを含めて、そのまま使用します。

jQGrid-同じように、ローカリゼーションファイルを含めてそのまま使用します。

それはすべて正常に機能します...ASPXページの「script」タグは単一の「script」タグに結合されます。jslib.axd HttpHandlerにリクエストを送信し、ハンドラーはすべてのJSファイルを1つのファイルに結合し、GZipで圧縮し、圧縮ファイルをFileSystemに保存してから、そのファイルをクライアントに送信します。

問題:唯一の問題は、サイトが中国語に切り替わったときです。サイトが中国語で、GZip圧縮とFileSystemキャッシュを使用している場合、クライアントに到着するJavaScriptは無効です。「UncaughtSyntaxError:UnexpectedtokenILLEGAL」などの奇妙な文字やエラーが含まれています。いくつかの調査の結果、jqGridとjQueryDatepickerの中国語のローカライズされたファイルでのみ問題が見つかりました。
クライアントに到着する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圧縮を無効にすると、everithingは正常に機能しました。キャッシュをOutputCacheに変更すると、中国語でFileSystemCacheを使用してGZipを使用する場合、everithingが機能します...唯一の問題です。他のすべての言語(日本系言語も含む)は完璧に機能します。

何が問題になるのかさえわかりません。エンコーディングなどに関連しているのではないかと思いましたが、圧縮されたJSをファイルに書き込むようなパラメーターやプロパティがFileStreamに表示されません。

その問題を解決するのを手伝ってください。

ありがとう。

4

1 に答える 1

0

解決しました!!! 問題は、UtilsクラスのMBCompressionStringToBytesメソッドにありました。

        /// <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 に答える