Hello World
Spiga

BlogEngine 1.0中的编码问题及解决方案

2007-06-06 22:03 by 老赵, 6933 visits

似乎有不少朋友在下在BlogEngine 1.0的源代码之后会发现居然无法正确编译,因为{SiteRoot}\User Controls\CommentView.cs里的代码遇到了错误:

public void RaiseCallbackEvent(string eventArgument)
{
    string[] args = eventArgument.Split('?);
    string author = args[0];
    string email = args[1];
    string website = args[2];
    string country = args[3];
    string content = args[4];

    // ...
}

嗯?第一行代码为什么单引号没有封闭?作者怎么会把一个无法编译的版本发布出去呢?其实问题并非那么简单,不过我们姑且先将单引号补全吧。

编译,通过。进入任意一篇文章。咦,为什么又出现脚本错误了(如下),问题真多啊……

Script Error

打开客户端的代码一看,果然有错误:

function AddComment()
{
    // ...
    var argument = author + "? + email + "? + website + "? + country + "? + content;
    // ...
}

哎,为什么……又是引号没有配对,而且又出现问号了?不如上官方网站http://www.dotnetblogengine.net看看吧。

官方网站其实也用了Blog Engine,但是进入查看文章页面后却没有发生问题。找到AddComment方法一看,果然!

function AddComment()
{
    // ...
    var argument = author + "¤" + email + "¤" + website + "¤" + country + "¤" + content;
    // ...
}

问题出现了,就是这个古怪的字符“¤”坏了事。由于我们的编辑器无法识别出这个字符,因此就将它和后面的引号一起变成了问号。那么,到底这个符号是做什么用的呢?我们又该如何修改它呢?

经过简单的代码分析(猜测?)就可以发现,这段代码的作用是使用AJAX方式添加评论,那个古怪的字符“¤”的作用是分隔一些信息。因为在添加注释时,作者名、Email、URL、国家和评论内容会拼接成一个字符串并作为body给post到服务器端去,所以需要一个在这些文字中都不出现的字符(串)来作为分隔符。服务器端的代码也出现了问题,也就是因为它需要使用这种特殊字符拆分客户端post过来的内容。

要解决它自然很简单,我们只需要使用一段不会出现在文字中的字符(串)即可。我不希望再用这种特殊的字符,因此我最终将两段代码改成了如下模样:

public void RaiseCallbackEvent(string eventArgument)
{
    string[] args = eventArgument.Split(new string[] { "?/?/?" }, StringSplitOptions.None);
    string author = args[0];
    string email = args[1];
    string website = args[2];
    string country = args[3];
    string content = args[4];

    // ...
}

function AddComment()
{
    // ...
    var argument = author + "?/?/?" + email + "?/?/?" + website + 
        "?/?/?" + country + "?/?/?" + content;
    // ...
}

我使用“?/?/?”替换了那个特殊字符,只要用户在回复评论时不输入这段字符串就好了。

上周我在移植我的英文blog系统时也遇到过,幸好没有多久就顺利地解决了这个问题。目前我的英文blog系统http://blog.jeffzon.net使用的便是Blog Engine 1.0,我在源代码的基础上也作了一些简单的修改,增加了一些功能。例如像博客园在首页显示Description的做法,大家访问我的英文blog时可以发现,系统首页上并没有完整的文章内容,而是有选择地显示了文章的Description,并添加了“read more...”链接。这样的做法似乎更合理一些,抑或是我已经习惯博客园了?:)

 

点击这里可以下载到修改后的CommentView.ascx和CommentView.ascx.cs文件。

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

73 条回复

  1. yueue
    *.*.*.*
    链接

    yueue 2007-06-06 22:04:00

    mark
    最近也准备开一个英文BLOG,也打算用BE

  2. overred
    *.*.*.*
    链接

    overred 2007-06-06 22:40:00

    刚下拉个 你就发这篇文章 哈哈

  3. MK2
    *.*.*.*
    链接

    MK2 2007-06-06 23:14:00

    我觉得惟一不满意的就是现在的XMLPrivoder,第一次运行时都将全部文章加载了,一旦文章多了,不知道会怎样 。。。。。

    :)
    BlogEngine的确写得很漂亮;
    因为我的买的空间没有将.axd文件注册了,搞到Module失效了,Js和Css都无法加载。。。

  4. Cat Chen
    *.*.*.*
    链接

    Cat Chen 2007-06-06 23:22:00

    不用转义符而用¤,这都算是靠侥幸编程咯……

    我想大家都知道这个符号什么意思吧:
    ^¤^
    等美国人都用上了这些符号那BlogEngine的设计就成为明显的bug了。不过我也想知道美国人第一次看到Orz会理解成什么,呵呵……

  5. goalbell[未注册用户]
    *.*.*.*
    链接

    goalbell[未注册用户] 2007-06-07 00:03:00

    不知道LZ有没有留意到后台那个Add entry的插入图片功能也有错误呢?

  6. 老赵
    admin
    链接

    老赵 2007-06-07 00:54:00

    @MK2
    很难不全部加载,呵呵。因为BlogProvider只有返回所有Post的接口,您不用XmlBlogProvider估计也需要完全加载。不过其实文章等等占用内存并不高,一时半会尔不用担心,呵呵。
    // 让空间服务商帮你注册吧,呵呵。

  7. 老赵
    admin
    链接

    老赵 2007-06-07 00:56:00

    @goalbell
    是吗?那么可能是编辑器的原因。不过其实我至今没有使用过这个功能写过文章唉,呵呵。

  8. 老赵
    admin
    链接

    老赵 2007-06-07 00:56:00

    @Cat Chen
    正规做法自然应该是转义,呵呵。
    我倒从来没有见过“^¤^ ”,只见过“^&^ ”,呵呵。

  9. MK2
    *.*.*.*
    链接

    MK2 2007-06-07 01:08:00

    @Jeffrey Zhao
    呵呵,估计后续版本会有变化的。

  10. MK2
    *.*.*.*
    链接

    MK2 2007-06-07 01:26:00

    @Jeffrey Zhao
    有没有些好的空间推荐一下,特别是有完善的Web管理功能的。

  11. 老赵
    admin
    链接

    老赵 2007-06-07 01:26:00

    @MK2
    看BlogEngine的方向吧,它本来就没有想过要做企业级阿分布式等等的,呵呵。

  12. Vincent Yang
    *.*.*.*
    链接

    Vincent Yang 2007-06-07 08:10:00

    这种乱码问题到处都是!我用en的系统,打开discussNT也会出现问题。。。。

  13. ZergTant[未注册用户]
    *.*.*.*
    链接

    ZergTant[未注册用户] 2007-06-07 09:06:00

    编码问题flexwiki也是这样,手动改下就好了

  14. 哈密瓜牌牛奶
    *.*.*.*
    链接

    哈密瓜牌牛奶 2007-06-07 09:21:00

    终于解决了:)

  15. finesite
    *.*.*.*
    链接

    finesite 2007-06-07 09:40:00

    Jeffrey Zhao 我刚才看了你的英文blog,感觉好爽,速度好快,风格也好,里面的好多功能都是我需要的,能把你现在用的blog源码发给我一份吗? 刚好我也学习以下ajax,好吗?谢谢你啦 english_me@163.com

  16. 王克伟
    *.*.*.*
    链接

    王克伟 2007-06-07 09:41:00

    @Jeffrey Zhao
    谢谢Jeffrey Zhao的分享

  17. 冰戈
    *.*.*.*
    链接

    冰戈 2007-06-07 09:55:00

    还是单用户的?
    有没有强点多用户的?

  18. KiddLee
    *.*.*.*
    链接

    KiddLee 2007-06-07 10:03:00

    恩呢,谢谢

  19. 民工丙[未注册用户]
    *.*.*.*
    链接

    民工丙[未注册用户] 2007-06-07 10:14:00

    我想问下里面控制面板页pages主要是作什么用啊?

  20. Vincent Yang
    *.*.*.*
    链接

    Vincent Yang 2007-06-07 14:03:00

    To finesite

    这是微软的blog engine,不是老赵自己的

  21. 老赵
    admin
    链接

    老赵 2007-06-07 15:06:00

    @MK2
    这个我就不是很清楚了,感觉都大同小异。

  22. 老赵
    admin
    链接

    老赵 2007-06-07 15:09:00

    @Vincent Yang
    所以建议要用Unicode作为源码文件的编码,呵呵。
    对了,我觉得BlogEngine的encoding问题处理得很巧妙(?),我再研究一下再看看。:)

  23. 老赵
    admin
    链接

    老赵 2007-06-07 15:11:00

    @finesite
    我用的就是BlogEngine,您可以去官方下载源代码。不过这个系统的AJAX功能只有一点点,并非学习AJAX的好材料。

  24. 老赵
    admin
    链接

    老赵 2007-06-07 15:11:00

    @冰戈
    .Text这种,不过复杂了点,呵呵。BlogEngine其实是多用户共享一个Blog系统的使用方式。

  25. 民工丙[未注册用户]
    *.*.*.*
    链接

    民工丙[未注册用户] 2007-06-07 15:55:00

    只要是好东西就行,,,,,,

  26. 民工丙[未注册用户]
    *.*.*.*
    链接

    民工丙[未注册用户] 2007-06-07 15:58:00

    后台pages模块我没搞明白是做什么用的,,保存后只是生成一个xml文件..
    老赵知道吗?

  27. 老赵
    admin
    链接

    老赵 2007-06-07 17:19:00

    @民工丙
    Page就是一些页面而已,可以访问的到,不过路径必须自己记住,例如:
    http://www.jeffzon.net/blog/page/Released-Components.aspx

  28. sumtec@beijing
    *.*.*.*
    链接

    sumtec@beijing 2007-06-07 18:48:00

    极其危险的修改方式……不好意思,测了一下你的博客是否有漏洞,结果是有。

    赶紧修复一下吧!
    http://www.jeffzon.net/Blog/post/AjaxFileUploadHelper-updated-to-v11.aspx#comment

  29. 老赵
    admin
    链接

    老赵 2007-06-07 22:49:00

    @sumtec@beijing
    哥们……我岂会不知故意使用“?/?/?”会有问题呢?我选用这个字符串就是因为我认为在一般情况下没有人会使用这个……以后要试验还是用自己部署的系统吧,反正这是一个开源的系统。不过还是谢谢了。:)

  30. 老赵
    admin
    链接

    老赵 2007-06-07 23:03:00

    @sumtec@beijing
    我现在在客户端进行了简单的限制,虽然还是可以使用工具模拟页面作post,但是请不要这么做了。blogengine的这个问题上本身就有问题,我有时间的话改一下。

  31. Join miao
    *.*.*.*
    链接

    Join miao 2007-06-07 23:03:00

    DasBlog不错~还有就是能不能把BlogEnginee你改的那个ReadMore 拿出来分享一下~学习学习

  32. 老赵
    admin
    链接

    老赵 2007-06-07 23:04:00

    @Join miao
    一会儿吧,可能等我在分析blogengine的时候再说。:)

  33. 乐趣电子书[未注册用户]
    *.*.*.*
    链接

    乐趣电子书[未注册用户] 2007-06-07 23:04:00

    学习了 多谢分享

  34. Join miao
    *.*.*.*
    链接

    Join miao 2007-06-07 23:26:00

    这是个很大的Bug啊~唉~太不安全~并且你还把你改的那个字符串给Public了~你是怕你系统不被入侵啊?呵呵:)

  35. 老赵
    admin
    链接

    老赵 2007-06-07 23:39:00

    @Join miao
    别人为什么要入侵我?入侵我有什么价值?其实不能叫做入侵,只是损人不利己,别人为什么要这么做呢?我一个个人的blog而已,不想投入太大成本去维护它。
    不过这个的确是bug,在blogengine里本身就有问题,我只是没有解决这个bug而已,并非是我造成的。

  36. 怪怪[未注册用户]
    *.*.*.*
    链接

    怪怪[未注册用户] 2007-06-08 04:04:00

    老赵你真倒霉呵呵~~ 还是简单的改一下好了,省的别人没事去试 -__-

  37. 老赵
    admin
    链接

    老赵 2007-06-08 06:58:00

    @怪怪
    呵呵,已经在客户端检测了,总不见的再用工具什么去试吧,呵呵……

  38. sumtec@beijing
    *.*.*.*
    链接

    sumtec@beijing 2007-06-08 14:02:00

    @Jeffrey Zhao:
    Sorry! 没有想要搞破坏的意思,原来想着这样顶多也就是造成邮件地址那里的显示不太正常而已,没有想到会造成Exception。
    而且说实话,您这里自己都公开了,我不去做这个实验保不准别人会做实验。相对来讲,我的这个Post还是么有什么大的伤害性的。

  39. sumtec@beijing
    *.*.*.*
    链接

    sumtec@beijing 2007-06-08 14:06:00

    @Jeffrey Zhao:
    顺便唠叨一句:最好还是修改一下分割字符串吧,太招摇了。虽然普通客户端已经检验了,也难保有人强Post,而且万一有恶意怎么办?

  40. sumtec@beijing
    *.*.*.*
    链接

    sumtec@beijing 2007-06-08 14:08:00

    @Jeffrey Zhao:
    你确保现在是正确的?我怎么从首页点击进去显示404?造成不便不好意思,诚挚道歉!

  41. 老赵
    admin
    链接

    老赵 2007-06-08 16:02:00

    @sumtec@beijing
    请问您访问的是哪张页面?我点了几张页面都是好的。

  42. jeffy chu[未注册用户]
    *.*.*.*
    链接

    jeffy chu[未注册用户] 2007-06-09 06:39:00

    老赵,请问为什么给你发邮件总是被打回呢?

  43. AlphaWu
    *.*.*.*
    链接

    AlphaWu 2007-06-09 11:39:00

    我为了这个系统,装了一个虚拟机,win2003 ent sp2.大小还不到100M。
    打开才看到了那个奇怪的字符。

  44. 老赵
    admin
    链接

    老赵 2007-06-09 17:42:00

    @jeffy chu
    email是好好的,什么叫做“打回”?

  45. ddr888
    *.*.*.*
    链接

    ddr888 2007-06-12 08:33:00

    本人也在用 不过汉化了一下下
    http://www.allup.com.cn/default.aspx
    感觉用起来挺好看的,但是有几个问题是老赵没提到的:
    1,如果一个标题都是中文,那么点击标题只能进入日志最上面的一篇,只能点prelink才能正常,我的解决办法是,在用实体的title字段生产标题栏时,把代码检测一节去掉,因为它本来只认为英文字母大小写有效。
    private static bool IsAllowedCharacter(char character)
    {
    string allowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-";
    foreach (char c in allowedChars)
    {
    if (c == character)
    return true;
    }

    return false;
    }


    2,还有上面老赵提到的编码问题,我就用了?号代替了,这个肯定不如老赵的方法了。
    3,把鼠标放在日志正文下面的链接,分类以及其他几项上去,其上面就会出现一个小小横线,这个不影响使用。(ie)
    4,不管用xml还是sqlserver,在首页列出所有日志和列出所有分类日志,甚至某一篇日志的详细信息,都要把所有日志取出然后遍历一次。
    this.Post = Post.GetPost(id);
    .......
    ///


    /// Returs a post based on the specified id.
    ///

    public static Post GetPost(Guid id)
    {
    foreach (Post post in Posts)
    {
    if (post.Id == id)
    return post;
    }

    return null;
    }
    这样感觉不好。

  46. 老赵
    admin
    链接

    老赵 2007-06-12 09:42:00

    @ddr888
    嗯,我这篇文章只是谈编码问题的。
    关于4,我在以前一篇文章中也有谈过,BlogEngine本不是为了大型系统而用的,呵呵。

  47. ddr888
    *.*.*.*
    链接

    ddr888 2007-06-12 15:22:00

    @Jeffrey Zhao
    原来如此啊,我上个星期才接触这个东东,感觉很清爽就用了一下 ,还要向你多学习啊

  48. finesite
    *.*.*.*
    链接

    finesite 2007-06-12 19:56:00

    刚次试了,如果评论超长dddddddddd 之类的,它不会截断 how to solve?

  49. 老赵
    admin
    链接

    老赵 2007-06-12 20:22:00

    @finesite
    把容器的overflow设为hidden就可以了。

  50. 阿司匹林[未注册用户]
    *.*.*.*
    链接

    阿司匹林[未注册用户] 2007-06-13 19:04:00

    不能评论而且国家那里不能选择,这是什么原因?

  51. 老赵
    admin
    链接

    老赵 2007-06-13 19:40:00

    @阿司匹林
    能不能再说的具体一些呢?

  52. 阿司匹林[未注册用户]
    *.*.*.*
    链接

    阿司匹林[未注册用户] 2007-06-13 20:35:00

    明白了,感谢~~
    也是由于CommentView.ascx.cs的原因引起的

    另外问一下“有选择地显示了文章的Description,并添加了“read more...”链接”这个怎么处理?

  53. 妇代会[未注册用户]
    *.*.*.*
    链接

    妇代会[未注册用户] 2007-06-13 22:13:00

    用Web Deployment Project生成一个dll时会出现错误~
    错误 6 “aspnet_merge.exe”已退出,代码为 1。 1 1 BlogEngine

  54. Leepy
    *.*.*.*
    链接

    Leepy 2007-06-15 16:58:00

    谢谢!解决了:)

  55. MK2
    *.*.*.*
    链接

    MK2 2007-06-22 10:38:00

    @Jeffrey Zhao
    对主页只显示摘要而不显示全文, 老赵是怎样修改的呢?

    我本来是想Postlist.ascx.cs中, 用Description代替Content的, 但要重新new
    一个Post....

    在Postview.ascx中修改却要修改每个Theme的, 这样耦合就更高了...

  56. 老赵
    admin
    链接

    老赵 2007-06-22 14:35:00

    @MK2
    需要修改3个文件,不过它的结构等等都不用修改的,只是增加一些额外的属性就可以了。有时间的话我写一下。:)

  57. 有请你了[未注册用户]
    *.*.*.*
    链接

    有请你了[未注册用户] 2007-06-27 15:25:00

    有请你了把那个“read more”抽时间写一下 谢谢!

  58. shitao[未注册用户]
    *.*.*.*
    链接

    shitao[未注册用户] 2007-06-27 17:46:00

    请老赵和诸位大大帮我看看:我使用“BlogEngine 1.0”建的一个测试用博客,我准备对第3、4、6等篇文章发表评论,却总蹦出第一篇文章让我写评论,大家遇见没用?

  59. 老赵
    admin
    链接

    老赵 2007-06-27 21:36:00

    @shitao
    打不开唉

  60. shitao[未注册用户]
    *.*.*.*
    链接

    shitao[未注册用户] 2007-06-28 08:24:00

    @Jeffrey Zhao
    不好意思 博客存在我自己的电脑上 下班后关机了 现在可以了:http://219.138.49.44/tao/

  61. shitao[未注册用户]
    *.*.*.*
    链接

    shitao[未注册用户] 2007-06-28 11:05:00

    找到问题的原因了
    原来是“Title”不支持中文,Title的内容就是自动生成的文件名,如果所有的标题都是中文,它就都只生成一个文件“.aspx”,这样它就只认最上面的一篇!

  62. shitao[未注册用户]
    *.*.*.*
    链接

    shitao[未注册用户] 2007-06-28 11:26:00

    最新发现:竟然categorys(分类)也不支持中文,需要改进的地方还真不少。

  63. 老赵
    admin
    链接

    老赵 2007-06-28 11:27:00

    @shitao
    找到问题就好。:)

  64. finesite
    *.*.*.*
    链接

    finesite 2007-07-03 23:10:00

    老赵 能提供一个开源的 多用户blog吗? cnblogs那个 有不少错误 ,编译都不能通过

  65. 老赵
    admin
    链接

    老赵 2007-07-04 00:10:00

    @finesite
    cnblogs那个是什么意思啊?

  66. finesite
    *.*.*.*
    链接

    finesite 2007-07-05 13:41:00

    Jeffrey Zhao
    我的意思是 cnblogs 是从.text 进一步开发而来的,有不少编译通不过的问题,你是否还知道有比较好的 多用户 blog 推荐一下 !

  67. 老赵
    admin
    链接

    老赵 2007-07-05 13:52:00

    @finesite
    我用过subtext,还是可以的。.text不会编译不过阿,自己看看到底什么问题吧。

  68. finesite
    *.*.*.*
    链接

    finesite 2007-07-17 13:20:00

    thks

  69. finesite
    *.*.*.*
    链接

    finesite 2007-07-20 15:24:00

    老赵,请教你可否把 blogengine加入到现有的站点中,类似 http://www.abc.com/blog ?

  70. 老赵
    admin
    链接

    老赵 2007-07-20 15:35:00

    @finesite
    需要改动较多地方,BlogEngine还是处于某个应用程序比较好。

  71. MK2
    *.*.*.*
    链接

    MK2 2007-08-11 15:28:00

    @Jeffrey Zhao
    呵呵, BlogEngine.Net将会在1.2修复这个问题了.
    目前我下载的最新版本中, 编码已经修改了:
    var argument = author + "-|-" + email + "-|-" + website + "-|-" + country + "-|-" + content + "-|-" + notify;

  72. 老赵
    admin
    链接

    老赵 2007-08-11 16:06:00

    @MK2
    关键不在用什么字符关键还是转嘛。如果这样的话,用户输入“-|-”怎么办呢?

  73. MK2
    *.*.*.*
    链接

    MK2 2007-08-11 16:10:00

    @Jeffrey Zhao
    我明白, 只是现在不用每次更新到要改这几个地方的代码了....
    :)

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我