#include<stdioh>
#include<windowsh>
void GetUtf8(unsigned short uni)
{
unsigned char utf_8[3];
utf_8[0]=(0xe<<4) | ((uni & 0xf000)>>12);//相当于把二进制1110右移12位
utf_8[1]=(0x2<<6) | ((uni & 0x0fc0)>>6); //相当于把二进制10右移16位
utf_8[2]=(0x2<<6) | (uni & 0x003f); //相当于取二进制低6位
printf("UTF-8编码的第一个字节为0x%2x\n",utf_8[0]);
printf("UTF-8编码的第一个字节为0x%2x\n",utf_8[1]);
printf("UTF-8编码的第一个字节为0x%2x\n",utf_8[2]);
}
void main()
{
char a[3];
wchar_t str;
printf("输入一个汉字:\n");
gets(a);
MultiByteToWideChar(CP_ACP, 0, a, -1, &str, 1);
printf("%s", a);
printf("字Unicode编码为%x\n",(unsigned short)str);
GetUtf8((unsigned short)str);
}
UTF-8是一种多字节编码的字符集,表示一个Unicode字符时,它可以是1个至多个字节,在表示上有规律:
1字节:0xxxxxxx
2字节:110xxxxx
10xxxxxx
3字节:1110xxxx
10xxxxxx
10xxxxxx
4字节:11110xxx
10xxxxxx
10xxxxxx
10xxxxxx
这样就可以根据上面的特征对字符串进行遍历来判断一个字符串是不是UTF-8编码了。应该指出的是UTF-8字符串的各个字节的取值有一定的范围,并不是所有的值都是有效的UTF-8字符,但是一般的应用的情况下这样的判断在对足够长的字符串及是比较精确了,而且实现也比较简单。具体的字节取值范围可以参见"Unicode
Explained"一书中的643。
bool
IsUTF8(const
void
pBuffer,
long
size)
{
bool
IsUTF8
=
true;
unsigned
char
start
=
(unsigned
char)pBuffer;
unsigned
char
end
=
(unsigned
char)pBuffer
+
size;
while
(start
<
end)
{
if
(start
<
0x80)
//
(10000000):
值小于0x80的为ASCII字符
{
start++;
}
else
if
(start
<
(0xC0))
//
(11000000):
值介于0x80与0xC0之间的为无效UTF-8字符
{
IsUTF8
=
false;
break;
}
else
if
(start
<
(0xE0))
//
(11100000):
此范围内为2字节UTF-8字符
{
if
(start
>=
end
-
1)
break;
if
((start[1]
&
(0xC0))
!=
0x80)
{
IsUTF8
=
false;
break;
}
start
+=
2;
}
else
if
(start
<
(0xF0))
//
(11110000):
此范围内为3字节UTF-8字符
{
if
(start
>=
end
-
2)
break;
if
((start[1]
&
(0xC0))
!=
0x80
||
(start[2]
&
(0xC0))
!=
0x80)
{
IsUTF8
=
false;
break;
}
start
+=
3;
}
else
{
IsUTF8
=
false;
break;
}
}
return
IsUTF8;
}
UTF-
16以16位为单元对UCS进行编码。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于
0x10000的UCS码,定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF
-16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。
/ Copyright (C) 2010 by Xingyou Chen <niatlantice@gmailcom>
Test OS is Debian squeese AMD64 , source file stored in UTF-8
If another encoding is used, this program may fail
/
#include <stdioh> / printf() from here /
int main()
{
int i = 0; / for loop /
char orig[6] = "中国"; / demo text, Chinese char is 3 byte long /
unsigned short dest[2]; / two 2-byte variable /
for(i = 0; i < 2; i++)
{ / Don't understand See UTF-8 and Unicode encoding /
dest[i] = (orig[3i] & 0x1F) << 12;
dest[i] |= (orig[3i + 1] & 0x3F) << 6;
dest[i] |= (orig[3i + 2] & 0x3F);
printf("%x", dest[i]);
}
printf("\n");
return 0;
}
====================================================
“中国”: UTF-8 e4b8ad e59bbd Unicode 4e2d 56fd
你给出的那个编码该是不正确的。这里只做了UTF-8到UCS-2的转换,
中文编码不少,没功夫全写出来(也写不全),UTF-8是我平时用的。
在开源环境中,这个根本不是问题,可以参考zh-autoconvert的源代码:
>
C语言,根据一个变量的大小把数字转换成UNICODE数组 0的UNICODE是:0030,1的UNICODE是:0031,2的UNICODE是:0032…… 如果变量是:1234 ,那生成的UNICODE应该是:array[] = ”0031003200330034” 如果变量是:5678 ,那生成的UNICODE应该是:array[] = ”0035003600370038” 如果变量是:34 , 那生成的UNICODE应该是:array[] = ”00300034” 如果变量是:4 , 那生成的UNICODE应该是:array[] = ”0034” 我想大家已经看明白了:这个变量最大是4位,最小是1位,要生成的这个数组必须是 字符串数组,要能根据变量的大小自动把数字转换成字符串,并且能根据变量的大小自动 调整自身长度
可以得到汉字的每个字节的ASCII码(内码)值,也可以得到它们的区位码:
#include<stdioh>
int main()
{unsigned char s[11]; int i,a,b;
printf("请输入姓名:");
gets(s);
printf("汉字\tASCII码\t\t内码\t区位码\n");
for(i=0;s[i];i+=2)
{ a=s[i]; b=s[i+1];
printf(" %c%c :\t%d %d\t\t%X%X\t%d",a,b,a,b,a,b,a-160);
if(b<170)printf("0%d\n",b-160);
else printf("%d\n",b-160);
}
system("pause");
return 0;
}
以上就是关于如何将一个汉字用C语言将其转换成Unicode编码最好直接编成UTF-8,是不是vc里面有函数可以直接编求程序全部的内容,包括:如何将一个汉字用C语言将其转换成Unicode编码最好直接编成UTF-8,是不是vc里面有函数可以直接编求程序、如何读取文件的编码信息 c语言、各位大侠: 在linux下如何用C实现汉字转unicode码。比如:“中国”转成“5E5D 66EF”,在线等~~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)