关于unicode编程的一个问题

关于unicode编程的一个问题

网络上关于unicode或宽字节编程的介绍很多,为什么要这样的的原因介绍的也很多,下面我们就从实用的角度出发,来看一下如果不采用unicode或者宽字节编程会给我们带来的一个问题.

我们通过一段代码来演示不采用unicode和采用了之后所产生的不同结果.

先看没有采用unicode:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

void main()

{

   char hz[32];

   char str[2][32] = {"钦佩","恼怒"};

   strcpy(hz,"");

for(int k=0;k<strlen(hz);k++)

   {

        printf("%02x",hz[k]);

   }

   printf("/n");

   for(int i=0;i<2;i++)

   {

        if (strstr(str[i],hz) != NULL)

        {

            printf("str ======%s/n",str[i]);

            for(int j=0;j<strlen(str[i]);j++)

                printf("%02x",str[i][j]);

            printf("/n");

        }

   }

}

输出结果为:

       ffffffd5ffffffc5

       str ======钦佩

       ffffffc7ffffffd5ffffffc5ffffffe5

       str ======恼怒

       ffffffc4ffffffd5ffffffc5ffffffad

不难看出,由于单字节的字符串处理函数是按一个字节一个字节处理的,钦佩恼怒两个字符串中都含有ffffffd5ffffffc5(""),所以输出结果为这两个字符串中都含有""这个字符串.

再来看看采用了宽字节的:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <wchar.h>

 

 

void main()

{

    wchar_t hz[32];

    wchar_t str[2][32] = {L"钦佩",L"恼怒"};

    wcscpy(hz,L"");

 

    for(int k=0;k<wcslen(hz);k++)

    {

        wprintf(L"%02x",hz[k]);

    }

    wprintf(L"/n");

    for(int i=0;i<2;i++)

    {

        if (wcsstr(str[i],hz) != NULL)

        {

            for(int j=0;j<wcslen(str[i]);j++)

                wprintf(L"%02x",str[i][j]);

            wprintf(L"/n");

        }

    }

}

输出结果:

    5f 20

这样,对字符串的处理就不再出现误判的情形.

在实际编程中,需要处理汉字的部分多集中在界面处理部分,当然在后台程序中也可能会涉及

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页