| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5904 人关注过本帖
标题:我用C程序怎么把汉字字串转换成十六进制形式的字符串
只看楼主 加入收藏
elesun8
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2014-12-29
结帖率:42.86%
收藏
已结贴  问题点数:2 回复次数:25 
我用C程序怎么把汉字字串转换成十六进制形式的字符串
我用C程序怎么把汉字字串转换成十六进制形式的字符串

例如:我输入汉字“四川省成都市双流县”得到字符串“56DB5DDD7701621090FD5E0253CC6D4153BF”(此为unicode UTF-8编码)

*******************汉字转unicode编码软件***************************
输入:四川省成都市双流县
输出:56DB 5DDD 7701 6210 90FD 5E02 53CC 6D41 53BF
*******************我现在用C语言程序实现此功能*********************
编译环境为Linux redhat gcc4.3.2

char geo_addr_utf8[100]="四川省成都市双流县";//为unicode UTF-8格式的汉字编码,geo_addr_utf8是从xml网页文件中提取出来的,内容是正确的。

strlen(geo_addr_utf8) = 27;//为什么长度为27个bytes,一个汉字两个字节,9个汉字应该是18个bytes才对?

for(i=0;i<strlen(geo_addr_utf8);i++)
{printf("%d,",geo_addr_utf8[i]);}printf("\n");
显示为:
-27,-101,-101,-27,-73,-99,-25,-100,-127,-26,-120,-112,-23,-125,-67,-27,-72,-126,-27,-113,-116,-26,-75,-127,-27,-114,-65,


for(i=0;i<strlen(geo_addr_utf8);i++)
{printf("0x%02X,",geo_addr_utf8[i]);}printf("\n");
显示为:
0xFFFFFFE5,0xFFFFFF9B,0xFFFFFF9B,0xFFFFFFE5,0xFFFFFFB7,0xFFFFFF9D,0xFFFFFFE7,0xFFFFFF9C,0xFFFFFF81,0xFFFFFFE6,0xFFFFFF88,0xFFFFFF90,0xFFFFFFE9,0xFFFFFF83,0xFFFFFFBD,0xFFFFFFE5,0xFFFFFFB8,0xFFFFFF82,0xFFFFFFE5,0xFFFFFF8F,0xFFFFFF8C,0xFFFFFFE6,0xFFFFFFB5,0xFFFFFF81,0xFFFFFFE5,0xFFFFFF8E,0xFFFFFFBF,
为什么显示出来都是四字节的十六进制,char为单字节数字吧


for(i=0;i<strlen(geo_addr_utf8);i++)
{printf("%C,",geo_addr_utf8[i]);}printf("\n");
显示为:
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,,?,?,?,?,?,
这是怎么回事?

如何实现输入为geo_addr_utf8输出为geo_addr_HexString“56DB5DDD7701621090FD5E0253CC6D4153BF”

顺便问一下:Linux gcc默认编译的汉字为GB2312吧?
搜索更多相关主题的帖子: 汉字编码 成都市 十六进制 四川省 字符串 
2015-01-21 12:17
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:1 

授人以渔,不授人以鱼。
2015-01-21 12:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你看到我作类型转换了么?

授人以渔,不授人以鱼。
2015-01-21 12:57
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:1 
strlen(geo_addr_utf8) = 27;//为什么长度为27个bytes,一个汉字两个字节,9个汉字应该是18个bytes才对?
------ 你自己说了是“utf8编码”
2015-01-21 13:34
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:1 
UTF-8一个汉字三个字节

http://zh.



2015-01-21 13:52
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
收藏
得分:1 
对的,这个方法不错

我不是砖家,要努力成为砖家。
2015-01-21 14:11
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
此为unicode UTF-8编码
------ 你瞎说的吧,我特意写了个程序跑了一下,对于“四川省成都市双流县”
GBK编码是  CBC4 B4A8 CAA1 B3C9 B6BC CAD0 CBAB C1F7 CFD8
utf8编码是 E59B9B E5B79D E79C81 E68890 E983BD E5B882 E58F8C E6B581 E58EBF
utf16码是  56DB 5DDD 7701 6210 90FD 5E02 53CC 6D41 53BF

为什么显示出来都是四字节的十六进制,char为单字节数字吧
------ %X对应的是unsigned int类型(由char扩展而来),你应该用 %02hhX
2015-01-21 14:16
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用rjsp在2015-1-21 14:16:14的发言:

此为unicode UTF-8编码
------ 你瞎说的吧,我特意写了个程序跑了一下,对于“四川省成都市双流县”
GBK编码是  CBC4 B4A8 CAA1 B3C9 B6BC CAD0 CBAB C1F7 CFD8
utf8编码是 E59B9B E5B79D E79C81 E68890 E983BD E5B882 E58F8C E6B581 E58EBF
utf16码是  56DB 5DDD 7701 6210 90FD 5E02 53CC 6D41 53BF

为什么显示出来都是四字节的十六进制,char为单字节数字吧
------ %X对应的是unsigned int类型(由char扩展而来),你应该用 %02hhX

我估计她用的是软件转的 转出来是UTF-16
2015-01-21 14:32
young
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:223
专家分:160
注 册:2004-9-5
收藏
得分:1 
这个是GB2312 转unicode ucs2的源码
https://bbs.bccn.net/viewthread.php?tid=69098&page=1#pid1293231

[ 本帖最后由 young 于 2015-1-22 09:55 编辑 ]

如果你爱C语言,请你爱指针; 如果你爱指针,请你爱指针的指针;
2015-01-22 09:50
young
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:223
专家分:160
注 册:2004-9-5
收藏
得分:0 
ucs2 转 utf8的代码,网上很多的,我这也有一个,是一个2字节ucs2转3字节utf8的编码
int mmi_chset_ucs2_to_utf8(unsigned char *utf8, unsigned short int ucs2)
{
    int count;

    if (ucs2 < (unsigned short int) 0x80)
    {
        count = 1;
    }
    else if (ucs2 < (unsigned short int) 0x800)
    {
        count = 2;
    }
    else
    {
        count = 3;
    }
    switch (count)
    {
        case 3:
            utf8[2] = 0x80 | (ucs2 & 0x3f);
            ucs2 = ucs2 >> 6;
            ucs2 |= 0x800;
        case 2:
            utf8[1] = 0x80 | (ucs2 & 0x3f);
            ucs2 = ucs2 >> 6;
            ucs2 |= 0xc0;
        case 1:
            utf8[0] = (unsigned char) ucs2;
    }
    return count;
}

如果你爱C语言,请你爱指针; 如果你爱指针,请你爱指针的指针;
2015-01-22 10:17
快速回复:我用C程序怎么把汉字字串转换成十六进制形式的字符串
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012340 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved