存档

‘所谓技术’ 分类的存档

Unicode编解码函数

2006年3月10日 小李刀刀 2 条评论

在用XMLHTTP进行远程数据传输的时候,如果涉及到不同编码,比如从oblog向我的博客发送一个trackback ping,数据中包含的中文字符就会出现乱码。

为了解决这个问题,可以在发送之前,把所有的数据中的中文都进行Unicode编码然后再传输。这样就可以顺利解决问题。

但是有时候还会涉及到另外一个问题,就是到了目标程序后,要进行数据库检索,发送过来的中文字符串都已经编码为类似 &#32462 这样的Unicode编码,而数据库中的数据虽然以unicode编码保存,但是却还是中文字符,并没有表示为 &#32462 这样的形式。这就导致检索失败。

为了解决这样的问题,我只好采取这样的办法:发送端对中文字符串进行Unicode编码,接受端接收后进行Unicode解码,还原为中文字符。

这两个函数如下:

'**************************************************
'函数名:AnsiToUnicode
'作  用:转换为 Unicode 编码
'参  数:str —- 要转换的字符
'返回值:转换后的字符
'Author:nt2003
'**************************************************
Public Function AnsiToUnicode(ByVal str)
    Dim i, j, c, i1, i2, u, fs, f, p
    AnsiToUnicode = ""
    p = ""
    For i = 1 To Len(str)
        c = Mid(str, i, 1)
        j = AscW(c)
        If j < 0 Then
            j = j + 65536
        End If
        If j >= 0 And j <= 128 Then
            If p = "c" Then
                AnsiToUnicode = " " & AnsiToUnicode
                p = "e"
            End If
            AnsiToUnicode = AnsiToUnicode & c
        Else
            If p = "e" Then
                AnsiToUnicode = AnsiToUnicode & " "
                p = "c"
            End If
            AnsiToUnicode = AnsiToUnicode & ("&#" & j & ";")
        End If
    Next
End Function
'**************************************************
'函数名:AnsiToUnicode
'作  用:转换为 Unicode 编码
'参  数:str —- 要转换的字符
'返回值:转换后的字符
'**************************************************
Function UnicodeToAnsi(ByVal str)
    If IsNull(str) or str = "" Then
        UnicodeToAnsi = ""
        Exit Function
    End If
    Dim reg,strMatch,strTemp,arrMatches
    strTemp = str
    Set reg = New RegExp
    reg.IgnoreCase = True
    reg.Global = False
    reg.Pattern = "&#(d*);"
    Set arrMatches = reg.Execute(str)
    For Each strMatch In arrMatches
        str = Replace(str,strMatch.Value,chrW(strMatch.SubMatches(0)))
    Next
    set reg=Nothing
    UnicodeToAnsi = str
End Function

分类: 所谓技术 标签:

C#学习笔记:理解规范接口的赋值运算

2005年12月16日 小李刀刀 3 条评论

最近在学习C#,现在看的书是台湾黄聪明先生编著的《C#面向对象的程序设计》(科学出版社出版),与以往读的Wrox系列或者其他国外计算机教程不同,这本书里没有任何地方提供了与作者联系或者反馈的途径,也没有提供此书的在线交流网址或者新闻组。

在书中第8章《类与面向对象程序设计》第8.3.4节讲规范接口(interface)的赋值运算时,作者设计了这样一个练习题:“将实现interface的对象赋给该interface的引用是可以的,那么请问:这样的赋值运算在直觉上是否合理?”

作者的解答如下:“以逻辑学的推论来看,这个赋值运算是合理的,就好像说:所有的女人都是人,郑雅文是女人,所以郑雅文是人;故:所有的USB鼠标都是符合USB规范的,罗技生产的的鼠标是USB鼠标,所以罗技生产的USB鼠标是符合USB规范的”。

看完作者的第一个逻辑推理例子之后,我觉得我已经懂了:所有实现一个interface的对象,都必须实现这个interface规定的特征,将其中某个对象A赋给一个引用该interface的对象B时,只有在该interface中定义的成员才会被赋值给对象B,而对象A中独有的成员则不会被赋值给对象B。

但是继续看作者推理的后半部分的时候,我却感觉怪怪的,总觉得别扭。仔细把两个实例好好比较一下,发现后半个例子的逻辑推理有问题。如下:

  • 所有的A都是B;
  • C是A;
  • 所以C是B;

例子一:

  • 所有的女人(A)都是人(B);—-女人是人的子类,不管女人是不是规范,都必然是人;
  • 郑雅文(C)是女人(A);
  • 所以郑雅文(C)是人(B);

例子二:

  • 所有的USB鼠标(A)都是符合USB规范的(B);USB鼠标是“符合USB规范的”的子类?次品??
  • 罗技生产的鼠标(C)是USB鼠标(A); 罗技只生产USB鼠标?不生产PS/2的??
  • 所以罗技生产的USB鼠标(C??)是符合USB规范的(B);

作者的第二个例子本身存在的逻辑推理是不是正确先不提(参考斜体部分),只说在其结论句中的C和第二个条件句中的C已经在范畴上发生了变化,那他怎么还能套用这个公式呢?罗技生产的USB鼠标,和罗技生产的鼠标,其外沿已经发生了变化。如果把这个例子正确地还原成推理公式,就变成了:

  • 所有的A都是B;
  • C是A;
  • 所以D是B。

这就难怪让人感觉别扭了,它根本就是错误的。

回到那个题目里来,我们假定B是一个规范接口(interface),A是一个符合B的对象,C是一个引用B的对象,则A中符合B的成员将赋值给C,作者想说明的应该是这样的关系。在这里,跟推理公式相比较,在公式中的A是B的子类或者叫子集,而在题目中的A却不是B的子集,因此作者所举的例子根本就不能用来解释这个关系。其实用直观的方法很容易就把关系说明了:

  1. B是一个规范接口,规定了两个成员x和y { B.成员x B.成员y }
  2. A是一个符合B的对象,规定了三个成员x,y和z(注意:x和y必须有) { A.成员x A.成员y A.成员z }
  3. C是一个引用B的对象,则C也有两个成员x和y { C.成员x C.成员y }

当我们把A赋值给C是发生了什么?结果如下:

C.成员x = A.成员x

C.成员y = A.成员y

而A.成员z不会被赋值为C.成员z,因为成员z不是规范接口B中规定的成员。

分类: 所谓技术 标签:

利用WebService进行网站整合的实现

2005年12月15日 小李刀刀 2 条评论

一、设定环境为两个站点对等整合;

站点一:http://tempurl.org

站点二:http://myurl.com

站点一和站点二希望共享注册用户;以用户Email为用户的唯一标识;

现在,有站点二的用户A访问站点一,过程如下:

用户在站点一用站点二的信息进行登陆–>站点一验证用户失败–>向站点二查询该用户信息–>站点二验证成功,将信息返回给站点一–>站点一登记该用户信息并进行登陆–>用户登录成功。

站点一的登陆验证过程:

1.获得用户提交的email和密码;

2.进行数据库查询和验证–>失败;

3.引用站点二的WebService(假设为MyInterface),本地实例名为sValidator;

4.判断:If sValidator.IsUser = True then

username = sValidator.username
password = svalidator.password
5.登记此用户,将基本信息写入数据库;

6.登陆此用户。

如果是站点一的用户登录站点二,过程一样。

二、设定环境为多站点以站点一为核心进行整合;

站点一:http://tempurl.org

站点二:http://www.myurl.com

站点三:http://bbs.myurl.com

站点一为核心;一种情况是注册可以各自进行,在站点一以外的站点注册时,先通过站点一的Webservice进行注册,如果注册失败,则在本地站点也不予注册;这样确保所有用户在站点一都有记录;

假设A用户在站点二进行注册

流程如下:

注册成功的:站点二提交该用户信息给站点一进行注册–>站点一进行检验,资料没问题,写入数据库,注册成功,返回一个信息给站点二–>站点二将用户资料写入数据库,注册成功;

注册失败的:站点二提交该用户信息给站点一进行注册–>站点一进行检验,资料有问题或其它原因,不能注册,返回一个信息给站点二–>站点二向用户返回注册失败信息;

站点二的注册流程:

1.获取用户信息,进行有效性等验证通过;

2.引用站点一的WebService,假设为MyInterface,本地实例名:sRegUser

3.进行注册

sRegUser.UserName = username
sRegUser.Password = password
sRegUser.UserEmail = useremail
If sRegUser.Reg = True Then
'进行本地注册
Else
'注册失败
End If

现在,用户A通过站点二已经注册成功了,他分别到在三个站点进行登陆

站点一:

用户登录–>站点一验证登陆成功

站点二:

用户登录–>站点二验证登陆成功

站点三:

用户登录–>站点三验证登陆失败,向站点一查询–>站点一验证登陆成功,返回给站点三–>站点三在本地数据库登记该用户–>站点三验证登录成功

上述的整个思路,是以站点一的WebService作为核心,如果站点二是ASP.NET站点,那么就创建本地代理来使用;如果站点三是ASP站点,那么可以考虑采用Microsoft Soap Tool Kit,如果是其它语言平台的,就用其它语言平台的WebService使用工具。都不行的情况下,可以用Post请求的方式来进行。

具体的实现以后如果有空再细谈,这里只是一个思路,其实这样的思路并不复杂,而且已经有很多运用的实例了。实现起来不是问题,只是多注意WebService的安全性就好了。

分类: 所谓技术 标签:

实践:用Div+CSS重构网页

2005年12月12日 小李刀刀 1 条评论

  从接触WEB标准以来,一直在努力实践,近日官方网站的全面改造终于正式展开,由于网站管理系统的WYSWYG编辑器本身不支持WEB规范,也是没办法的事情,但是我还是决定在这次改版的过程要充分利用CSS,在可能的程度上尽量利用Div+CSS的优点,减少维护量和网页大小。

  第一批改造的是新闻中心和招生网,在重新制作的几个模版页面中,我们只用了少量的表格和内联代码,之所以没有完全采用Div+CSS,是因为经过WYSWYG编辑器的自动更改,多层嵌套的DIV代码会变得非常不易读,即使我们在制作时把代码写得非常的清晰,缩进和换行用得很好,也最终会得到一个结构混乱的HTML源代码。因此只能适当采用一定数量的表格,但是对表格也尽量采用CSS来控制了。而网页中的任何


这类的代码,则完全去掉了。

  改完以后,代码总量减少到原来的一半左右,而且网页中的表格都只在很小的范围内使用,尽量避免嵌套,使网页的速度得到了很大的提高,虽然没有实现对WEB规范的支持,但是采用DIV+CSS的效果还是非常明显的。

  今天我又重做网站首页,对网站首页,我就完全采用了DIV+CSS来进行网页布局,首页以前的表格更为混乱,嵌套很深,由于原来的代码量就不是很多,所以改完以后,代码减少也还不算太多,只为原来的一半左右。但是访问速度提升很多,而在规划好CSS以后,网页的布局部分真是轻松极了。

  我取了其中一部分代码来比较:

重构前的代码(全页大小共计38K):

[code]
1

2

3

4

5

6

二外新闻 新闻中心 | 院 报 | 广 播 台 | 电 视 台 | 媒体二外

6

5

4

3

2

1

[/code]

  说明:为了实现在760像素表格(1像素边框)左中右三栏划分(布局),然后对中栏进行上中下划分(布局),再对中栏进行左中右划分(边距),再对中栏进行左中右划分(内容),加上部分一像素边框和代码不够优化,一共出现了6层嵌套,而且多次编辑以后,还出现了嵌套错误(多出一层结束标记)

重构后的代码(全页大小共计17.8k):

[code]
1

1
[/code]

说明:
1首先用一个

作为容器,把左中右三栏都装在760像素居中的区域;
2利用浮动实现两个同级div左右分栏同时实现边框;
3利用浮动把右边的div再分成左右两栏同时实现边框;
4在中央的div中从上到下每行用一个div容器包括,在容器中利用浮动实现左右划分;

  在这个比较中,为了便于对比,去除了所有定义外观的属性代码,以及内联样式,包括div的id和class,仅仅从结构上可以看出,div比table在左右分栏和上下分栏上就节省了很多代码,而且最为关键的是,同样是嵌套,div的显示也会比table快。而如果加上定义外观的代码,那么table还要增加很多属性代码,而Div需要增加的就基本上只是id和class了。

具体的页面地址:http://www.bisu.edu.cn
(由于编辑器的原因,代码不符合XHTML标准,而且CMS系统输出的代码还含有单一表格,这是很无奈的事情)

分类: 所谓技术 标签: ,

小技巧:给英文版Office2003“充电”

2005年12月4日 小李刀刀 没有评论

中文版的Office 2003里面,有一些亚洲语言专有选项,尤其是中文的特性,在英文版里就没有,不光是默认没有安装,而是软件里就完全没有那部分功能。

  比如中文简体繁体互换啊,中英文互译啊,中文的拼写检查和断字等等。

  在用英文版Office 2003的时候又想用这些针对中文的特殊功能,那怎么办呢?

  据说有Office的多国语言包,不过我在网上没找到2003版的,所以只好自己想办法了,最后让我找到了解决办法:

  1.如果不是中文操作系统,则操作系统必须已经安装了简体中文语言包(繁体装没装好象无所谓,反正我没装繁体语言包,只增加了繁体中文支持);

  2.正常安装Office 2003 英文版;

  3.运行Office 2003 简体中文版或者繁体中文版的安装程序,在安装向导中,选择和英文版完全一致的安装路径,选择自定义模式;

  4.在安装模块选择时,Word,Excell,Outlook….都选择“不安装”,进入具体选项中,在“Office 共享工具”中,先整体选择“不安装”,然后一个个展开子选项,把你需要的部分选中,比如“微软拼音输入法2003”或者“五笔输入法”,当然还有间繁体对换这些功能啦。

  5.安装完以后,你会发现,英文版的Office 2003没有受到任何影响,但是打开Word,在”tools”菜单下面,”language”项里,你会发现多出来的“Chinese translate”,随便输入几个汉字,选择这个菜单,你就会看到中文简繁体转换的提示了(当然是英文提示)。

  以上操作在WinXP Pro SP2 英文版 + Office 2003 英文企业版中成功。

分类: 所谓技术 标签:

Visual Studio 2005体验感受

2005年12月3日 小李刀刀 4 条评论

Visual Studio .Net 2003一直没有好好试试,只是拿它做了个.NET的个人通讯录自己用,这次去微软发布会现场看到的演示,感觉Visual Studio 2005有很大的改进,因为我在现场的时候试用了一下WEB开发功能,感觉很不错,很多工作一行代码都不用写就能实现的。

  所以今天就装了Visual Studio 2005体验了一把。

  VS2005安装的时候集成了.NET FrameWork2.0, .NET Compact FrameWork 1.0SP3和2.0,Device Emulator 1.0, Document Explorer 2005, SQL SERVER 2005 Express Edition和Native Client等相关工具,比2003方便易用得多,而且安装过程也比2003快,还没有那么多重启,界面也很漂亮。

[align=center][/align]

  或许是因为英文版的关系,VS2005+MSDN+SQL Server 2005安装完以后比2003占用的空间小了很多,不过不知道是不是我的机器还是系统的问题,启动后,建立工程,修改配置等等操作都比2003慢。

  装完以后还没来得及更细致地探索VS2005,小小地试用了一下,用它建立了一个.NET 站点,写了个手机用的小程序,感觉很爽,最欣慰的是:

  1. VS 2005自带了WEB SERVER,所以无需IIS即可本机调试WEB站点,而且调试功能比IIS和VS.NET2003要强大得多得多;

  2. VS 2005建立的页面默认是XHTML 1.0 Transitional规范,符合WEB标准,HTML Editor也改善非常多,提供了50多种WEB 控件,非常方便。

  3. 利用VS2005的智能设备开发界面,很轻松就可以写出手机或者PDA的应用程序,而且本身集成了相关智能设备的模拟器,其中的 SmartPhone 2003模拟器长得好像多普达的界面,我正好用的是多普达智能手机,太高兴了:)

  4.Visual Studio .Net 2003的工程,我升级了两个到2005,都是全自动完成,而且Error 0, Warning 0,这下可以放心了。

  微软把Visual Studio .NET 2003中的“.NET”去掉,直接命名为Visual Studio 2005,可见他们对这套产品的信心,第一步体验的结果,也的确感觉非常不错。

  很多人应该还在等中文版,网上也有人利用SQL Server 2005 CTP中的语言包来制作出VS2005的简体中文版,其实感觉还是应该用英文版好,本身程序员多多少少都还是会点英语的吧,而且一款开发软件,其实真正用到的英语也很少而且很简单,软件本身又是多语言支持的,用英文版适应以后,肯定会比用中文版感觉舒服得多的。

  这个礼拜要给研究生处做一套WEB程序,很小但是很多特性都适合用XML和.NET来做,我决定用VS2005来开发,正好是个熟悉软件和练习的好机会:)

CSS学习之综合运用

2005年11月29日 小李刀刀 3 条评论

  以前我也用CSS,不过只是很简单地用它来控制字体大小、链接样式,表格边框而已。要说页面布局和排版,我从来没想过用CSS,毕竟我用表格可以算得上是滚瓜烂熟了,表格+少许CSS,我已经能够实现所有需要的效果了。

   直到最近DIV+CSS布局的页面开始成为潮流,我看了一些网站,总体感觉还是不如表格的漂亮。可是当去除CSS以后,看看人家的内容仍然整整齐齐地显示在页面上,而且很少有多余的东西,再看看一个页面里去除了那许多的表格和字体代码后,结构清晰的源代码,我才真正理解很多书上讲的CSS的优点。

   买了一本《CSS权威指南》来看,顺便在正在改版的学校网站上“学以致用”,今天为止,不能说熟练掌握,不过总算是基本上掌握了CSS的使用。做了一个融合字体、背景、布局、定位等的例子,算是对自己这段时间学习的总结。

  这个标题部分,如果用表格,至少需要两行一共5个单元格。我用了下面的代码来实现:

<div class="redtitlebox" style="WIDTH: 300px">  
    <div class="redtitleleft"></div>
    <div class="redtitlemain">热门图文</div>
    <div class="redtitleright"></div>
    <div class="redtitlerightbody" style="WIDTH: 185px">专题:</div>
</div>

对应的CSS规则:

.redtitlebox {
  width:100%;
  position:static;
  border-bottom:2px solid #900;
  margin:0px;padding:0px; }
.redtitleleft {
  width:8px;
  background:url(skin/oldbisu/redtitlebg_left.gif) no-repeat;
  float:left;
  height:20px;
  line-height:20px;
  margin:0px;
  font-size:0px;
  color: #FFF;
}
.redtitleright {
  width:7px;
  background:url(skin/oldbisu/redtitlebg_right.gif) no-repeat;
  float:left;
  height:20px;
  line-height:20px;
  margin:0px;
  font-size:0px;
  color: #FFF;
}
.redtitlemain {
  width:100px;
  text-align:center;
  background:url(skin/oldbisu/redtitlebg_main.gif) repeat-x;
  float:left;
  height:20px;
  line-height:20px;
  margin:0px;
  font-weight: bold;
  color: #fff;
  font-size: 12px;
}
.redtitlerightbody {
  max-width:645px !important;
  float:right;
  height:20px;
  line-height:20px;
  background:url(skin/oldbisu/titlebg.gif) repeat-x;
  margin-bottom:0px;
  color: #666;
  font-size: 12px;
   text-align:right;
 }

   如果只是为了实现一个效果,似乎这个过程比用表格来实现还复杂了,但是考虑到这个效果将被运用在几千个网页里,就会觉得非常划算了。CSS毕竟只需要下载一次,而且这里还有我本身的问题,写CSS的经验还不够丰富,所以上面的样式规则肯定难免有一些冗余的地方。

   总之,用CSS做网页的感觉,真的是很不错的……

分类: 所谓技术 标签: ,

为我的blog写的Google地图生成器

2005年11月24日 小李刀刀 没有评论

  好长时间没用ASP开发了,今天用Div+CSS重构学校的官方网站,做得头晕,回到家突然想起来给自己的blog做一个google的站点地图生成程序,就动手了。

   这个东西很简单,google地图是规范的XML文件,只要按照Google说明的格式把网址都列出来就可以了。因为我的blog重新做以后内容还少,Google说一个地图文件可以容纳50000个索引,按照每天新增一篇日至计算的话,还要100多年以后我的地图才会超出标准,所以我就没有打算做地图索引,直接用一个文件做地图了。 阅读全文…

分类: 所谓技术 标签: , ,