c语言把unicode转换为字符,[C语言]Unicode编码(二)-中文字符刷选

[C语言]Unicode编码(二)-中文字符刷选

发布时间:2020-06-30 20:43:20

来源:51CTO

阅读:1967

作者:風子余

Unicode编码(二)-中文字符刷选

1,UTF-8编码中三字节中文字符的刷选方法如下:int

chinese_filter(unsigned char one, unsigned char two )

{

int flag = -1;

if ( one >= 0x4E && one 

{

flag = 1;

}

else if ( one == 0x9F && two <= 0xCB )

{

flag = 1;

}

else if ( one >= 0x34 && one 

{

flag = 1;

}

else if ( one == 0x4D && two <= 0xB5 )

{

flag = 1;

}

else if ( one == 0x2F && two <= 0xD5 )

{

flag = 1;

}

else if ( one == 0x2E && two >= 0x80 && two <= 0xF3 )

{

flag = 1

}

else if ( one >= 0xF9 && one 

{

flag = 1;

}

else if ( one == 0xFA && two <= 0xD9 )

{

flag = 1;

}

else if ( one == 0xE8 && two >= 0x15 && two <= 0x6F )

{

flag = 1;

}

else if ( one >= 0xE4 && one 

{

flag = 1;

}

else if ( one == 0xE5 && two <= 0xE8 )

{

flag = 1;

}

else if ( one == 0xE6 && two <= 0xCF )

{

flag = 1;

}

else if ( one == 0x31 && two >= 0xC0 && two <= 0xE3 )

{

flag = 1;

}

else if ( one == 0x2F && two >= 0xF0 && two <= 0xFB )

{

flag = 1;

}

else if ( one == 0x31 && two >= 0x05 && two <= 0x20 )

{

flag = 1;

}

else if ( one == 0x31 && two >= 0xA0 && two <= 0xBA )

{

flag = 1;

}

return flag;

}

2,UTF-8编码中四字节中文字符刷选方法如下:int

chinese_filter2( unsigned char one, unsigned char two, unsigned char thr )

{

int flag = -1;

if ( one == 0x02 && two 

{

/*20000-2A6D6*/

flag = 1;

}

else if ( one == 0x02 && two == 0xA6 && thr <= 0xD6 )

{

flag = 1;

}

else if ( one == 0x02 && two >= 0xA7 && two 

{

/* 2A700-2B734 */

flag = 1;

}

else if ( one == 0x02 && two == 0xB7 && thr <= 0x34 )

{

flag = 1;

}

else if ( one == 0x02 && two >= 0xB7 && thr >= 0x40 && two 

{

/* 2B740-2B81D */

flag = 1;

}

else if ( one == 0x02 && two == 0xB8 && thr <= 0x1D )

{

flag = 1;

}

else if ( one == 0x02 && two >= 0xF8 && two 

{

/* 2F800-2FA1D */

flag = 1;

}

else if ( one == 0x02 && two == 0xFA && thr <= 0x1D )

{

flag = 1;

}

return flag;

}

3,UTF-8字符转Unicode编码:

1)src为输入的UTF-8字符串

2)unicode为UTF-8字符串转换后输出的unicode编码串

3)chs为字符串中刷选出来的中文字符int

utf_to_unicode( unsigned char *src, unsigned char *unicode, unsigned char *chs )

{

int size = 0;

int ch_len = 0;

unsigned char one = 0x00;

unsigned char two = 0x00;

unsigned char thr = 0x00;

unsigned char fou = 0x00;

unsigned char fiv = 0x00;

unsigned char six = 0x00;

/* one使高位,FFFE方式存储,所以第一个取出来的one是高位 */

while ( *src )

{

if ( *src <= 0x80 )

{

one = *( src + 0 );

*( unicode + size++ ) = one;

src += 1;

}

else if ( *src >= 0xC0 && *src 

{

one = *( src + 0 );

two = *( src + 1 );

*( unicode + size++ ) = one & 0x03;

*( unicode + size++ ) = ( two & 0x3F ) | ( ( one & 0x03 ) <

src += 2;

}

else if ( *src >= 0xE0 && *src 

{

one = *( src + 0 );

two = *( src + 1 );

thr = *( src + 2 );

*( unicode + size++ ) = ( ( two & 0x3C ) >> 2 ) | ( ( one & 0x0F ) <

*( unicode + size++ ) = ( thr & 0x3F ) | ( ( two & 0x03 ) <

int val = chinese_filter( *( unicode + size - 2 ), *( unicode + size - 1 ) );

if ( val == 1 )

{

*( chs + ch_len++ ) = *( src + 0 );

*( chs + ch_len++ ) = *( src + 1 );

*( chs + ch_len++ ) = *( src + 2 );

}

src += 3;

}

else if ( *src >= 0xF0 && *src 

{

one = *( src + 0 );

two = *( src + 1 );

thr = *( src + 2 );

fou = *( src + 3 );

*( unicode + size++ ) = ( ( two & 0x30 ) >> 4 ) | ( ( one & 0x07 ) <

*( unicode + size++ ) = ( ( thr & 0x3C ) >> 2 ) | ( ( two & 0x0F ) <

*( unicode + size++ ) = ( fou & 0x3F ) | ( ( thr & 0x03 ) <

inr val = chinese_filter2( *( unicode + size - 3 ), *( unicode + size - 2 ), *( unicode + size - 1 ) );

if ( val == 1 )

{

*( chs + ch_len++ ) = *( src + 0 );

*( chs + ch_len++ ) = *( src + 1 );

*( chs + ch_len++ ) = *( src + 2 );

*( chs + ch_len++ ) = *( src + 3 );

}

src += 4;

}

else if ( *src >= 0xF8 && *src 

{

one = *( src + 0 );

two = *( src + 1 );

thr = *( src + 2 );

fou = *( src + 3 );

fiv = *( src + 4 );

*( unicode + size++ ) = one & 0x03;

*( unicode + size++ ) = ( ( thr & 0x30 ) >> 4 ) | ( ( two & 0x3F ) <

*( unicode + size++ ) = ( ( fou & 0x3C ) >> 2 ) | ( ( thr & 0x0F ) <

*( unicode + size++ ) = ( fiv & 0x3F ) | ( ( fou & 0x03 ) <

src += 5;

}

else if ( *src >= 0xFC )

{

one = *( src + 0 );

two = *( src + 1 );

thr = *( src + 2 );

fou = *( src + 3 );

fiv = *( src + 4 );

six = *( src + 5 );

*( unicode + size++ ) = ( two & 0x3F ) | ( ( one & 0x01 ) <

*( unicode + size++ ) = ( ( fou & 0x30 ) >> 4 ) | ( ( thr & 0x3F ) <

*( unicode + size++ ) = ( ( fiv & 0x3C ) >> 2 ) | ( ( fou & 0x0F ) <

*( unicode + size++ ) = ( six & 0x3F ) | ( ( fiv & 0x03 ) <

src += 6;

}

else

{

printf( "Error: unknoe scope\n" );

return -1;

}

}

*( unicode + size ) = '\0';

return size;

}

4,主函数测试程序和Unicode编码打印程序void

unicode_print( unsigned char *unicode, int size )

{

int index = 0;

for ( ; index 

{

printf( "%02X", *( unicode + index ) );

}

printf("\n");

}int

main( int argc, char *argv[] )

{

unsigned char ch4[] = "一A严严·";

int size = 0;

int len  = 0;

len = strlen( ch4 );

unsigned char unicode[len + 1];

memset( unicode, 0x00, len + 1 );

unsigned char china[len + 1];

memset( china, 0x00, len + 1 );

size = utf_to_unicode( ch4, len + 1, unicode, china );

unicode_print( unicode, size );

printf( "Chinese = %s\n", china );

return 0;

}

本文参考文献:http://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=kzb

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值