2012-10-25 13 views
0

我们使用以下组件开发我们的多语言网站:ASP.NET MBCompression对中国语言,jQuery UI的和的jqGrid

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

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

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

所有这一切工作正常... ASPX页面上的“脚本”标签组合到单一的“脚本”标签。它向jslib.axd发出请求HttpHandler,处理程序将所有JS文件组合到一个文件中,使用GZip压缩它,将压缩文件保存在FileSystem上,然后将该文件发送到客户端。

问题:唯一的问题是,当现场切换到中国的语言。当站点使用中文时,使用GZip压缩和FileSystem缓存,到达客户端的JavaScript无效 - 它包含奇怪的字符和错误,如“未捕获的SyntaxError:意外的令牌非法”。经过一番调查,我发现这个问题只与中文本地化的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压缩,everithing workd罚款。当我将缓存更改为OutputCache时,通过使用带有FileSystemCache的GZip中文版,唯一的问题是唯一的问题。所有其他语言(甚至Japanies)的作品都很完美。

我甚至不知道什么是一个问题。我认为它可能与编码或某事有关,但我没有看到FileStream上的这些参数或属性写入压缩的JS文件。

请帮我解决这个问题。

谢谢。

+0

奇怪。中文文件存储在什么编码中? –

+0

@Pekka UTF-8,代码页65001 –

+0

@AlexDn:你在你的问题中包含了很多标签。带有jqGrid和jQuery Datepicker中文本地化的JavaScript文件只是保存为UTF-8的常用JavaScript文件。所以我想你现有的问题只是**纯粹的MBCompresion **。我建议您删除不需要的标签,并尝试仅将问题解决给[MBCompresion](http://mbcompression.codeplex.com/)专家。您可以考虑将'[.net]'标签替换为'[asp.net]',并删除'[jqgrid]'和'[jquery-ui]'。 – Oleg

回答

0

已解决!!!这个问题在MBCompression StringToBytes方法的Utils类:

 /// <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); 
     } 

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

+0

就像我认为解决方案真的很纯粹的'MBCompresion'问题。 – Oleg