加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 教程 > 正文

JSPWiki文件名无法用于转换数据库的问题

发布时间:2023-05-31 13:35:39 所属栏目:教程 来源:
导读:这几天研究了一下jspwiki把网页存到硬盘上的代码,想出了一个解决的办法.

jspwiki把文件名转换成%xx的格式是为了能在硬盘上存储各个国家语言的文件,

如果我们只在中文环境下使用,则没有必要进行这样的转换.
这几天研究了一下jspwiki把网页存到硬盘上的代码,想出了一个解决的办法.
 
jspwiki把文件名转换成%xx的格式是为了能在硬盘上存储各个国家语言的文件,
 
如果我们只在中文环境下使用,则没有必要进行这样的转换.
 
  jspwiki里的pageprovider和attachmentprovider负责了上面的转换,
 
而这两个provider可以在jspwiki.properties里面设置,所以我们继承一下
 
jspwiki里提供的类,再在配置文件里设置一下,很容易就让jspwiki不进行文件名转换了.

  我是通过继承nativefilenameversioningfileprovider和basicattachmentprovider类实现子类的.可惜basicattachmentprovider中负责文件名转换的方法是static的,我在子类里没办法把它重载掉,这个问题已经向jspwiki的开发者提出修改意见了.现在page名可以存为中文了,附件名还要等到jspwiki的basicattachmentprovider修改了以后才能实现. 附件里是编译完的代码,把它拷贝到jspwiki的lib目录里,再在jspwiki.properties里设置
 
"jspwiki.pageprovider =net.sf.startemplate.nativefilenameversioningfileprovider"
 
就可以把page存为中文名的文件了.这个provider和已有的%xx形式的page不能正常工作,
 
需要把这些page的名称改成未编码的中文格式.
 
  至于utf8编码的文件用notepad修改后会在最前面添加3个字符,那都是微软做的孽,不用微软的
 
或者基于微软的文本编辑器就行了.(微软为了识别unicode的编码,在文件最开始加了标识符,
 
而其他公司并不承认这个标准,所以才导致这些标识符会被显示出来)

  浏览器对网址会转换成%xx形式后再向服务器,服务器收到以后也都有相应的逆向转换,这个应该
 
没有什么问题.
 
  很高兴和你交流!!
 
  以下是我的代码:两个provider和一个工具类
 
   1:/**
 
   2: * created on 2005-9-8 by dengber.
 
   3: */
 
   4:package net.sf.startemplate;
 
   5:
 
   6:import org.apache.log4j.logger;
 
   7:
 
   8:import com.ecyrd.jspwiki.providers.versioningfileprovider;
 
   9:
 
  10:/**
 
  11: * a privider for jspwiki.
 
  12: * this class behaves the same with <code>versioningfileprovider</code> provided
 
  13: * by jspwiki,excepting it saves wiki pages into harddisk with the name inputted
 
  14: * by the user. this is different with <code>versioningfileprovider</code>, it
 
  15: * will save wiki pages with a encoded name, such as %e6%b5%8b%e8%af%95.
 
  16: * though it is a good solution to save files whos name may contains any
 
  17: * charachers in the world, it is not readable.
 
  18: * <br /><br />
 
  19: * for many people, they use jspwiki only in a intranet, the character problem
 
  20: * above is nothing to them. saving wiki pages with the native charachter names
 
  21: * may working well to them. so this class is a choice to that people: the wiki
 
  22: * pages in harddisk have a readable name.
 
  23: * <br /><br />
 
  24: * danger: if the jspwiki user can input a character that can not be proccessed
 
  25: * by your server, not use this class.
 
  26: * <br /><br />
 
  27: * how to use:copy the jar file that contains this class to <b>lib</b>
 
  28: * directory of your jspwiki webapp, and set the following value to
 
  29: * jspwiki.properties:
 
  30: * jspwiki.pageprovider=net.sf.startemplate.nativefilenameversioningfileprovider
 
  31: *
 
  32: * @author dengber [email protected]
 
  33: *
 
  34: */
 
  35:public class nativefilenameversioningfileprovider extends
 
  36:        versioningfileprovider {
 
  37:    private static final logger log = logger
 
  38:            .getlogger(nativefilenameversioningfileprovider.class);
 
  39:
 
  40:    /**
 
  41:     * convert string to the formatting that can be as file name.
 
  42:     *
 
  43:     * @param pagename
 
  44:     * @return
 
  45:     */
 
  46:    protected string manglename(string pagename) {
 
  47:        final string[] windows_device_names = { "con", "prn", "nul",
 
  48:            "aux", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7",
 
  49:            "lpt8", "lpt9", "com1", "com2", "com3", "com4", "com5", "com6",
 
  50:            "com7", "com8", "com9" };
 
  51:
 
  52:        log.debug("manglename(" + pagename + ")");
 
  53:        pagename = textutil.encodefilename(pagename);
 
  54:
 
  55:        boolean windowshackneeded = false;
 
  56:        string os = system.getproperty("os.name").tolowercase();
 
  57:
 
  58:        if (os.startswith("windows") || os.equals("nt")) {
 
  59:            windowshackneeded = true;
 
  60:        }
 
  61:
 
  62:        if (windowshackneeded) {
 
  63:            string pn = pagename.tolowercase();
 
  64:            for (int i = 0; i < windows_device_names.length; i++) {
 
  65:                if (windows_device_names[i].equals(pn)) {
 
  66:                    pagename = "$$$" + pagename;
 
  67:                }
 
  68:            }
 
  69:        }
 
  70:
 
  71:        log.debug("manglename()=" + pagename);
 
  72:        return pagename;
 
  73:    }
 
  74:
 
  75:    /**
 
  76:     * convert string converted by <code>manglename()</code> to its orginal
 
  77:     * value.
 
  78:     *
 
  79:     * @param pagename
 
  80:     * @return
 
  81:     */
 
  82:    protected string unmanglename(string pagename) {
 
  83:        log.debug("unmanglename(" + pagename + ")");
 
  84:        boolean windowshackneeded = false;
 
  85:        string os = system.getproperty("os.name").tolowercase();
 
  86:
 
  87:        if (os.startswith("windows") || os.equals("nt")) {
 
  88:            windowshackneeded = true;
 
  89:        }
 
  90:
 
  91:        if (windowshackneeded && pagename.startswith("$$$")
 
  92:                && pagename.length() > 3) {
 
  93:            pagename = pagename.substring(3);
 
  94:        }
 
  95:
 
  96:        log.debug("unmanglename()=" + pagename);
 
  97:        return textutil.decodefilename(pagename);
 
  98:    }
 
  99:
 
 100:}
 
 101:
 
   1:/**
 
   2: * created on 2005-9-11 by dengber.
 
   3: */
 
   4:package net.sf.startemplate;
 
   5:
 
   6:import org.apache.log4j.logger;
 
   7:
 
   8:import com.ecyrd.jspwiki.providers.basicattachmentprovider;
 
   9:
 
  10:/**
 
  11: * a privider for jspwiki.
 
  12: * this class behaves the same with <code>versioningfileprovider</code> provided
 
  13: * by jspwiki,excepting it saves wiki pages into harddisk with the name inputted
 
  14: * by the user. this is different with <code>versioningfileprovider</code>, it
 
  15: * will save wiki pages with a encoded name, such as %e6%b5%8b%e8%af%95.
 
  16: *
 
  17: * @see net.sf.startemplate.nativefilenameversioningfileprovider
 
  18: *
 
  19: * @author dengber [email protected]
 
  20: *
 
  21: */
 
  22:public class nativefilenameattachmentprovider extends basicattachmentprovider {
 
  23:    private static final logger log = logger.getlogger(nativefilenameattachmentprovider.class);
 
  24:    
 
  25:    /**
 
  26:     * convert string to the formatting that can be as file name.
 
  27:     *
 
  28:     * @param pagename
 
  29:     * @return
 
  30:     */
 
  31:    protected string manglename(string pagename) {
 
  32:        log.debug("manglename(" + pagename + "");
 
  33:        return textutil.encodefilename(pagename);
 
  34:    }
 
  35:
 
  36:    /**
 
  37:     * convert string converted by <code>manglename()</code> to its orginal
 
  38:     * value.
 
  39:     *
 
  40:     * @param pagename
 
  41:     * @return
 
  42:     */
 
  43:    protected string unmanglename(string pagename) {
 
  44:        log.debug("unmanglename(" + pagename + "");
 
  45:        return textutil.decodefilename(pagename);
 
  46:    }
 
  47:}
 
  48:
 
   1:/**
 
   2: * created on 2005-9-11 by dengber.
 
   3: */
 
   4:package net.sf.startemplate;
 
   5:
 
   6:import org.apache.log4j.logger;
 
   7:
 
   8:/**
 
   9: * a utility class for string processing.
 
  10: *
 
  11: * @author dengber [email protected]
 
  12: *
 
  13: */
 
  14:public class textutil {
 
  15:
 
  16:    /**
 
  17:     * encode //:*?<>|% to %nn%nn formatting.
 
  18:     *
 
  19:     * @param filename
 
  20:     * @return
 
  21:     */
 
  22:    public static string encodefilename(string filename) {
 
  23:        stringbuffer result = new stringbuffer();
 
  24:        final string hex_digits = "0123456789abcdef";
 
  25:
 
  26:        for (int i = 0; i < filename.length(); i++) {
 
  27:            char c = filename.charat(i);
 
  28:            switch (c) {
 
  29:            case '//':
 
  30:            case '/':
 
  31:            case ':':
 
  32:            case '*':
 
  33:            case '?':
 
  34:            case '/"':
 
  35:            case '<':
 
  36:            case '>':
 
  37:            case '|':
 
  38:            case '%':
 
  39:                result.append('%');
 
  40:                //the character above is all one-byte character,
 
  41:                //so we only need to encode the most right 8 bit.
 
  42:                result.append(hex_digits.charat((c & 0xf0) >> 4));
 
  43:                result.append(hex_digits.charat(c & 0x0f));
 
  44:                break;
 
  45:            default:
 
  46:                result.append(c);
 
  47:            }
 
  48:        }
 
  49:
 
  50:        return result.tostring();
 
  51:    }
 
  52:
 
  53:    /**
 
  54:     * decode %nn%nn formatting string to its orginal value .
 
  55:     *
 
  56:     * @param filename
 
  57:     * @return
 
  58:     */
 
  59:    public static string decodefilename(string filename) {
 
  60:        stringbuffer result = new stringbuffer();
 
  61:
 
  62:        for (int i = 0; i < filename.length(); i++) {
 
  63:            char c = filename.charat(i);
 
  64:            switch (c) {
 
  65:            case '%':
 
  66:                char upper = filename.charat(++i);
 
  67:                char lower = filename.charat(++i);
 
  68:                char ch = (char) integer.parseint("" + upper + lower, 16);
 
  69:                result.append(ch);
 
  70:                break;
 
  71:
 
  72:            default:
 
  73:                result.append(c);
 
  74:                break;
 
  75:            }
 
  76:        }
 
  77:
 
  78:        return result.tostring();
 
  79:    }
 
  80:
 
  81:}
 
  82:
 
 
======= 2005-09-07 22:26:40 您在来信中写道:=======

> dengber,您好!
 
>
 
> 我从sf.net上面下载了你的startemplate,看看不错。
 
>
 
> 我最近正在将jspwiki部署到我公司上,作为一种工作日志、工作总结、技术文章的共享平台。有个问题想问你一下,不知道你是
 
否了解,如何让jspwiki里面用中文写的超级链接,所形成的实际文件名,可以成为中文编码呢?因为目前都会变成%xx%xx的形式
 
来表示中文。
 
>
 
> 我知道jspwiki是利用java写的,它的中文处理机制,完全就是java的机制,就是将所有编码,统一成utf-8编码。而windows200
 
0或以上的系统的默认编码,一般是unicode,这两者不太一样。我不知道你试过直接编辑jspwiki的数据文件没,我试过,发现只
 
能利用ultraedit之类的可以支持utf-8的编辑器,才可以成功编写,而如果利用windows自带的notepad来编辑的话,其文件头部
 
会自动被加上3个字节。
 
>
 
> 另外,当在浏览器里面,鼠标指向一个含中文字符的链接的时候,会被自动转换成可能试url所要求的表示形式,就是上述的两个
 
加了百分号的数字来表示一个汉字的方式。
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!