LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1088|回复: 6

怎么把url中的中文还原?

[复制链接]
发表于 2004-2-20 12:13:22 | 显示全部楼层 |阅读模式
比方我有一个url是:http://host/中文/中文.html,
但是我如果使用mozilla中的"copy link location", 它就会变成"http://host/%D6%D0%CE%C4/%D6%D0%CE%C4.html".
有什么办法把"http://host/%D6%D0%CE%C4/%D6%D0%CE%C4.html",
还原成"http://host/中文/中文.html"?

我这么做是因为mplayer只接受”http://host/中文/中文.html“这种形式,而不接受"http://host/%D6%D0%CE%C4/%D6%D0%CE%C4.html", 而我在mozilla中复制出来的却是后一种形式。
发表于 2004-2-20 17:30:55 | 显示全部楼层
这个可能需要看看CGI中关于GET/POST方法中的内容了……
发表于 2004-2-20 20:32:30 | 显示全部楼层
我估计还原成中文应该不难,那个字串实际上就是用文字表示的16进制码,只要把文本恢复成16进制数值就可以了。一个脚本就可以完成这个任务,不过我不会,不知道有没有高手感兴趣。
 楼主| 发表于 2004-2-21 09:56:15 | 显示全部楼层

尝试用php解决

但是出现了一些问题:
就是两个相同的中文url(除了协议),得到的link location却不一样
"http://host/中 文/中文.html" -> "http://host/%D6%D0%20%CE%C4/%D6%D0%CE%C4.html"
"rtsp://host/中 文/中文.html" -> "rtsp://host/%E4%B8%AD %E6%96%87/%E4%B8%AD%E6%96%87.html"
对于http协议的,可以使用urldecode($urlstring)函数解决,可是对于rtsp协议的却找不到解决的办法
发表于 2004-2-22 00:29:00 | 显示全部楼层
我以前写的,提供给你参考
char *decode_url( char *str)
{
char buf[MAX_LINE];
int i,j=0;
char word[3];
char de;
if(str!=NULL)
{
strcpy(buf,str);
//printf("url code%s\n",buf);
for(i=0;i<(int)strlen(buf);i++){
     if(buf=='%')
         {
         word[0]=buf[i+1];word[1]=buf[i+2];word[2]='\0'; i+=2;
     sscanf(word,"%x",&de);
     //printf("%c\n",de);
     //printf("%x\n",de);
         //printf("%d\n",de);
     sprintf(str+j,"%c",de);
     j++;
         }
     else if (buf=='\0') break;
         else if (buf=='+'){sprintf(str+j,"%c",' ');j++;}
     else
         {
                 sprintf(str+j,"%c",buf);j++;
         }
}
str[j]='\0';
}
return str;


}
 楼主| 发表于 2004-2-22 18:05:37 | 显示全部楼层
最初由 undefined 发表
我以前写的,提供给你参考
char *decode_url( char *str)
{
char buf[MAX_LINE];
int i,j=0;
char word[3];
char de;
if(str!=NULL)
{
strcpy(buf,str);
//printf("url code%s\n",buf);
for(i=0;i<(int)strlen(buf);i++){
     if(buf=='%')
         {
         word[0]=buf[i+1];word[1]=buf[i+2];word[2]='\0'; i+=2;
     sscanf(word,"%x",&de);
     //printf("%c\n",de);
     //printf("%x\n",de);
         //printf("%d\n",de);
     sprintf(str+j,"%c",de);
     j++;
         }
     else if (buf=='\0') break;
         else if (buf=='+'){sprintf(str+j,"%c",' ');j++;}
     else
         {
                 sprintf(str+j,"%c",buf);j++;
         }
}
str[j]='\0';
}
return str;


}

谢谢,但是这个还是不能正确处理rtsp协议的(看我前面的例子)。他的编码跟http得不一样。
 楼主| 发表于 2004-4-6 21:53:51 | 显示全部楼层
这个问题已经解决了
原来rtsp使用的编码是utf8,而http使用的好像是本地编码。
代码如下:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<iconv.h>

  4. #define MAX_LEN 4096
  5. int decode_rtsp_url(char *from, char* to, char* locale, size_t len);
  6. char * decode_http_url(char * url);

  7. int
  8. main(int argc, char **argv)
  9. {
  10.         char dest[MAX_LEN];
  11.         if(!strcmp("rtsp",argv[1]) || !strcmp("mms", argv[1]))
  12.         {
  13. //                printf("decode_rtsp\n");
  14.                 int errno = decode_rtsp_url(argv[2], dest, "GB18030", MAX_LEN);
  15.                 if(-1 == errno)
  16. //                        puts("error occured when converting\n");
  17.                         return 1;
  18.         }
  19.         else if(!strcmp("http", argv[2]))
  20.         {
  21.                 strcpy(dest, argv[2]);
  22.                 decode_http_url(dest);
  23.         }
  24.         else
  25.         {
  26.                 printf("you should specify the protocol\n");
  27.                 return 1;
  28.         }

  29.         printf("%s", dest);
  30.         return 0;
  31. }

  32. int
  33. decode_rtsp_url(char* from_str, char* to_str, char* locale, size_t len)
  34. {
  35.         int from_len = strlen(from_str);
  36.         len = (from_len < len)? from_len: len;
  37.         char *str = (char*)malloc(sizeof(char) * from_len);
  38.         char* str_free = str;
  39.         int i,j=0;
  40.         for(i = 0; i < len; i++)
  41.         {
  42.                 if('%' == from_str[i])
  43.                 {
  44.                         char word[3];
  45.                         int code;
  46.                         word[0] = from_str[++i];
  47.                         word[1] = from_str[++i];
  48.                         word[3] = '\0';
  49.                         sscanf(word, "%x", &code);
  50.                         str[j++] = code;
  51.                 }
  52.                 else
  53.                         str[j++] = from_str[i];
  54.         }
  55.         str[j]='\0';
  56.         //printf("utf8 encoded string str = %s\n", str);
  57.         iconv_t utf8_locale = iconv_open(locale,"UTF8");
  58.         size_t inputleft = len, outputleft = MAX_LEN;
  59.         char* str_dest = to_str;
  60.         size_t bytes = iconv(utf8_locale, &str, &inputleft,
  61.                                                                   &str_dest, &outputleft);
  62.         free(str_free);
  63.         iconv_close(utf8_locale);
  64.         return bytes;
  65. }
  66. char*
  67. decode_http_url(char* str)
  68. {
  69. //the converted string is stored in str.
  70. //So you may need to copy the orign string to another place
  71. //before call this function.
  72.         char buf[MAX_LEN];
  73.         int i,j=0;
  74.         char word[3];
  75.         char de;
  76.         if(str!=NULL)
  77.         {
  78.                 strcpy(buf,str);
  79.                 //printf("url code%s\n",buf);
  80.                 for(i=0;i<(int)strlen(buf);i++){
  81.                         if(buf[i]=='%')
  82.                         {
  83.                                 word[0]=buf[i+1];word[1]=buf[i+2];word[2]='\0'; i+=2;
  84.                                 sscanf(word,"%x",&de);
  85.                                 //printf("%c\n",de);
  86.                                 //printf("%x\n",de);
  87.                                 //printf("%d\n",de);
  88.                                 sprintf(str+j,"%c",de);
  89.                                 j++;
  90.                         }
  91.                         else if (buf[i]=='\0') break;
  92.                         else if (buf[i]=='+'){sprintf(str+j,"%c",' ');j++;}
  93.                         else
  94.                         {
  95.                                 sprintf(str+j,"%c",buf[i]);j++;
  96.                         }
  97.                 }
  98.                 str[j]='\0';
  99.         }
  100.         return str;
  101. }
复制代码

后面的那个decode_http_url就是照抄undefined的。
使用方法,假设编译出的可执行文件名为decode_url
decode_url http|mms|http url
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表