在C中解码Unicode(韩文)字符

时间:2014-06-10 13:39:27

标签: c string unicode webserver decode

我正在用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

所以我无法得到那个领域。有什么方法可以解码这些奇怪的角色来获得原始角色吗?

2 个答案:

答案 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", &currentchar ) == 1 ) {
        fputc( currentchar, decodee );
    }

    putchar( 10 );
    return 0;
}

文件 percentencoded 包含以下内容:

%EB%B0%95%EC%9A%B0%EC%A4%91

生成的文件 decodee 现在内部包含以下内容:

박우중

我希望这能帮助你,不知怎的......