【问题标题】:Decode Unicode (Korean) characters in C在 C 中解码 Unicode(韩语)字符
【发布时间】:2014-07-31 07:25:05
【问题描述】:

我正在用 C 语言制作一个 Web 服务器。我需要从 url 中获取参数以进行计算。问题是人们可以输入 unicode 字符的一个字段(名称)。但是,当我的服务器收到该请求时,这些 un​​icode 字符就变成了我不理解的东西。例如:

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

所以我无法获得该字段。有什么办法可以解码这些奇怪的字符以获得原始字符?

【问题讨论】:

  • 那些奇怪的字符是 hex utf-8。只需将其解析为十六进制,“逐个字符”,您将获得 utf-8 编码的韩语
  • 你能详细告诉我或者举个例子吗?

标签: c string unicode webserver decode


【解决方案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 现在里面有以下内容:

박우중

我希望这对你有所帮助...

【讨论】:

    【解决方案2】:

    所以这里有一些 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;
    }
    

    它是一个原始解析器,但它应该可以很好地解决这个简单的问题。我确定这已经存在于某个地方了

    【讨论】:

    • 谢谢,对你有很大帮助;)
    猜你喜欢
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多