Web服务器中文URL问题

继续等答案。。。


QUOTE:
原帖由 zz_1204 于 2006-2-28 17:52 发表
我在linux中的apache服务器的httpd.conf中加入了AddDefaultCharset GB2312
重起linux的apache后,这次url encode出来的代码和windows上的apacheurl encode出来的代码完全相同了,可是还是提示错误404,找不到文件 ...

加入了AddDefaultCharset GB2312 不行的原因是, AddDefaultCharset是用于输出时为 Contenet-Type 指定默认的输出字符集. 从apache的源代码 protocol.c 中可以证实这一点.

有种可原的原因是:
中文 Windows 操作系统的文件系统采用的是 GB2312格式的来存储文件名的, 而中文的 Linux 采用的是 UTF-8来存储文件名的. 当能过 FTP 等工具传送文件到服务器时, FTP 工具(客户端/服务器)并没有为文件名的编码方式进行转换.
这样, 同一个名字在不同的系统下就是两个不同的字串了, 所以WEB 服务器报告找不到.

有一种解决方法, 就是自已写个工具将文件名编码的编码方式由GB2312 转换为 UTF-8. 在 Unix 系统下可以调用函数 iconv() 进行转换, 细节我就不多说了.


QUOTE:
原帖由 newzy 于 2006-3-2 20:39 发表


加入了AddDefaultCharset GB2312 不行的原因是, AddDefaultCharset是用于输出时为 Contenet-Type 指定默认的输出字符集. 从apache的源代码 protocol.c 中可以证实这一点.

有种可原的原因是:
中文 Windows ...

就是您说的这种情况,但是恳请您说说细节吧,谢谢了


QUOTE:
原帖由 zz_1204 于 2006-3-3 11:00 发表

就是您说的这种情况,但是恳请您说说细节吧,谢谢了

就是写个程序, 让它帮着将文件名从 GB2312 转化成 UTF-8,
流程如下:
1. 打开一个目录
2. 获取一个文件名,
3. 获取结束, 到第 7, 如果该文件是个目录跳至第 1 步
4. 将文件名从GB-2312 转换成 UTF-8
5. 将原文件重名字成转化后的结果
6. 跳至第 1 步
7. 返回上一层

下面附的是我以前写的段转换编码的 C 程序, 可以参考
(因为设及公司代码, 我就只能贴这一部分了)

另外, 据我所知 Linux 下中文文件名支持得也不是太好,
所以在文件命名上最好在所有的系统上全使用英文名字.

[Copy to clipboard] [ - ]
CODE:
/*
*  Input:        fbuf,       = from buff
*           fsize,      = from size
*           tbuf,       = to buff
*           tsize,      = to size
*           fromcode,   = from code
*           tocode      = to cod
*           conflict    = to detect conflict, for expansibility future
*  Output:        convert error if occur
*  Return-Value: data length converted to
*  Description: convert buffer encode from 'fromcode' to 'tocode',
*               return the size of convert to,
*               otherwise ERROR if convert defeat
*/

int iconv_buf
    (
    char *              fbuf,       /* from buff */
    int                 fsize,      /* from size */
    char *              tbuf,       /* to buff */
    int                 tsize,      /* to size */
    char *              fromcode,   /* from code */
    char *              tocode      /* to code */
    )
{
        iconv_t                        c_pt;
        char *                        sin;        /*  */
        char *                        sout;       
        int                        lenin;                /*  */
        int                        lenout;

        /*  */
        sin = fbuf, sout = tbuf;
        lenin = fsize, lenout = tsize;

        debugf("iconv2: convert from %s to %s.\n\r", fromcode, tocode);
       
    /* open encode */
    if ((iconv_t)ERROR == (c_pt=iconv_open(tocode, fromcode)))
    {
        printf("iconv_open false: %s ==> %s\n", fromcode, tocode);
        return ERROR;
    }

    iconv(c_pt, NULL, NULL, NULL, NULL);

    /* convert */
    if (ERROR == (iconv(c_pt, &sin, &lenin, &sout, &lenout)))
        {
                /* only display at most first 32 characters */
        printf("*** stop at: %.*s", lenin>32? 32: lenin, sin);
                iconv_close(c_pt);
        return ERROR;
        }

        iconv_close(c_pt);

        return (tsize - lenout);
}

感谢!感谢!
我也有这样的问题。
看完。我也不会写。不过知道错误出在那了