网络上关于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
这样,对字符串的处理就不再出现误判的情形.
在实际编程中,需要处理汉字的部分多集中在界面处理部分,当然在后台程序中也可能会涉及