我正在用C语言制作一个Web服务器。我需要从url获取参数以进行计算。问题是有一个字段(名称),人们可以键入unicode字符。但是,当我的服务器收到该请求时,这些unicode字符将成为我无法理解的内容。例如:
http://192.168.1.1:10001/reg_me?name=박우중&studentid=2012003427
转为
http://192.168.1.1:10001/reg_me?name=%EB%B0%95%EC%9A%B0%EC%A4%91&studentid=2012003427
所以我无法得到那个领域。有什么方法可以解码这些奇怪的角色来获得原始角色吗?
答案 0 :(得分:1)
所以这里有一些C代码来完成我在评论中提到的内容。
假设您只是在"%EB%B0%95%EC%9A%B0%EC%A4%91"
parse(char * in, char * out){
strtok(in, "%"); // Note, the first token is empty, because the first character is a delimiter
char *token;
while(token = strtok(NULL,"%)){
unsigned c;
sscanf(token, "%x", c);
if(c > 0xFF) return -1;
*out++=c;
}
*out++ = '\0';
return 0;
}
它是一个原始的解析器,但它应该很好地解决这个简单的问题。我确定这已存在于某处
答案 1 :(得分:1)
我已将您的三个韩国标志保存到名为 korean 的文件中,将其放在我从下面的C源代码生成的可执行文件旁边:
#include <stdio.h>
int main( ) {
FILE * fp;
fp = fopen( "korean", "r" );
if ( fp == NULL ) {
printf( "Failure at line %d\n", __LINE__ );
return -1;
}
int currentchar;
while ( ( currentchar = fgetc( fp ) ) != EOF ) {
printf( "%%%X ", currentchar );
}
putchar( 10 );
return 0;
}
前两个百分号%%
只是在我的%X
之前有一个百分号,这将在基数16中打印currentchar
,十六进制,大写。您可以将其视为特定于%
的转义序列。输出是:
%EB %B0 %95 %EC %9A %B0 %EC %A4 %91
您可能已经意识到,这正是您所报道的序列。您可以使用此事实将这些值解码回韩语字符。让我们恢复这个过程;使用百分号和没有空格的百分比编码序列保存到文件中,将文件命名为 percentencoded ,并使用以下C源代码:
#include <stdio.h>
int main( ) {
FILE * decodee;
FILE * percentencoded;
decodee = fopen( "decodee", "w" );
percentencoded = fopen( "percentencoded", "r" );
if ( decodee == NULL || percentencoded == NULL ) {
printf( "Failure at line %d\n", __LINE__ );
return -1;
}
int currentchar;
while ( fscanf( percentencoded, "%%%X", ¤tchar ) == 1 ) {
fputc( currentchar, decodee );
}
putchar( 10 );
return 0;
}
文件 percentencoded 包含以下内容:
%EB%B0%95%EC%9A%B0%EC%A4%91
生成的文件 decodee 现在内部包含以下内容:
박우중
我希望这能帮助你,不知怎的......