silverlight在线阅读器(二):为silverlight增加gb2312编码

本文介绍了解决Silverlight不支持GB2312中文编码的方法,通过自定义Gb2312Encoding类实现了网页内容的正确解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  阅读器遇到的第一问题就是中文编码,许多网站都使用中文编码,而silverlight并不支持,这是首先要解决的问题。

  .NET Compact Framework同样也不支持GB2312编码,这个解决方法同样适用于.NET Compact Framework。

  方法其实很简单,通过GB2312与unicode的对照表。首先把取得字节码,再转行到Unicode码,最后查表取得对应汉字,接下来就是实现的问题了。

  首先定义转换字典:字典信息可以从 转换字典 获得。

  第二步实现Encoding类,命名为:Gb2312Encoding,代码如下:

  

ExpandedBlockStart.gif 代码
    public   class  Gb2312Encoding : Encoding
    {
        
public   override   string  WebName
        {
            
get
            {
                
return   " gb2312 " ;
            }
        }

        
public  Gb2312Encoding()
        {
            
        }
        
public   override   int  GetBytes( char [] chars,  int  charIndex,  int  charCount,  byte [] bytes,  int  byteIndex)
        {
            
throw   new  NotImplementedException();
        }

        
public   override   int  GetChars( byte [] bytes,  int  byteIndex,  int  byteCount,  char [] chars,  int  charIndex)
        {
            
int  j  =   0 ;
            
char  c;
            
for  ( int  i  =   0 ; i  <  byteCount; i  +=   2 )
            {
                
if  (i  +   1   >=  bytes.Length)
                {
                    
char [] last  =  Encoding.UTF8.GetChars( new   byte [] { bytes[i] });
                    chars[j]
= last[ 0 ];
                }
                
else
                {
                    
byte [] bb  =   new   byte [] { bytes[i], bytes[i  +   1 ] };
                    
if  (Gb2312toUnicodeDictinary.TryGetChar(bb,  out  c))
                    {
                        chars[j] 
=  c;
                        j
++ ;
                    }
                    
else
                    {
                        
char [] tt  =  Encoding.UTF8.GetChars( new   byte [] { bb[ 1 ] });
                        chars[j] 
=  tt[ 0 ];
                        j
++ ;
                        
// 测试下一个
                         if  (i  +   2   >=  bytes.Length)
                        {
                            
char [] tttt  =  Encoding.UTF8.GetChars( new   byte [] { bb[ 0 ] });
                            chars[j] 
=  tttt[ 0 ];
                            j
++ ;
                        }
                        
else
                        {
                            
byte [] test  =   new   byte [] { bb[ 0 ], bytes[i  +   2 ] };
                            
if  (Gb2312toUnicodeDictinary.TryGetChar(test,  out  c))
                            {
                                chars[j] 
=  c;
                                j
++ ;
                                i
++ ;
                            }
                            
else
                            {
                                
char [] ttt  =  Encoding.UTF8.GetChars( new   byte [] { bb[ 0 ] });
                                chars[j] 
=  ttt[ 0 ];
                                j
++ ;
                            }

                        }
                    }
                }
            }
           
            
return  chars.Length;
        }

        
public   override   int  GetByteCount( char [] chars,  int  index,  int  count)
        {
            
return  count;
        }
        
public   override   int  GetCharCount( byte [] bytes,  int  index,  int  count)
        {
            
return  count;
        }

        
public   override   int  GetMaxByteCount( int  charCount)
        {
            
return  charCount;
        }
        
public   override   int  GetMaxCharCount( int  byteCount)
        {
            
return  byteCount;
        }
        
public   static   int  CharacterCount
        {
            
get  {  return   7426 ; }
        }
    }


 最主要的是GetChars与GetBytes方法。两个方法是互逆的,一个编码一个解码。由于阅读器只用到了解码部分,这个类也只实现解码。编码和解码是一样的,只是逆向查表而已。

用到的可以自己实现。

使用方法:

ExpandedBlockStart.gif 代码
WebClient wc  =   new  WebClient();
                wc.Encoding 
=   new  Gb2312Encoding();
                wc.DownloadStringAsync(
new  Uri(Uri));
                wc.DownloadStringCompleted 
+=  (s, args)  =>
                {
                    
if  (args.Error  ==   null )
                    {
                        
                    }
                };

这样就可以得到Gb2312编码的网页内容了。

 

完整代码可以从下面的链接下载。

演示地址http://silverlightreader.limewebs.com/

代码http://htmlextractor.codeplex.com/

 

详细信息可以参考:http://blogs.msdn.com/b/feiyu/archive/2009/12/08/support-gb2312-in-silverlight-net-framework.aspx

接下来,silverlight 4的内存泄露问题与基于silverlight的欺骗服务器方法。

 没想到silverlight4 会有如此严重的bug,模板的内存不会得到释放,由于阅读器用到EMF,并且所有控件都是动态加载到模板中的,内存会疯狂增长

 silverlight在线阅读器(三):silverlight 4的内存泄露问题与基于silverlight的欺骗服务器方法

内容概要:该论文聚焦于T2WI核磁共振图像超分辨率问题,提出了一种利用T1WI模态作为辅助信息的跨模态解决方案。其主要贡献包括:提出基于高频信息约束的网络框架,通过主干特征提取分支和高频结构先验建模分支结合Transformer模块和注意力机制有效重建高频细节;设计渐进式特征匹配融合框架,采用多阶段相似特征匹配算法提高匹配鲁棒性;引入模型量化技术降低推理资源需求。实验结果表明,该方法不仅提高了超分辨率性能,还保持了图像质量。 适合人群:从事医学图像处理、计算机视觉领域的研究人员和工程师,尤其是对核磁共振图像超分辨率感兴趣的学者和技术开发者。 使用场景及目标:①适用于需要提升T2WI核磁共振图像分辨率的应用场景;②目标是通过跨模态信息融合提高图像质量,解决传统单模态方法难以克服的高频细节丢失问题;③为临床诊断提供更高质量的影像资料,帮助医生更准确地识别病灶。 其他说明:论文不仅提供了详细的网络架构设计与实现代码,还深入探讨了跨模态噪声的本质、高频信息约束的实现方式以及渐进式特征匹配的具体过程。此外,作者还对模型进行了量化处理,使得该方法可以在资源受限环境下高效运行。阅读时应重点关注论文中提到的技术创新点及其背后的原理,理解如何通过跨模态信息融合提升图像重建效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值