﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-I believe I can make a miracle-随笔分类-我的原创</title><link>http://www.cnitblog.com/wujian-IT/category/6357.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 10:45:56 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 10:45:56 GMT</pubDate><ttl>60</ttl><item><title>epoll的用法</title><link>http://www.cnitblog.com/wujian-IT/archive/2008/02/19/39948.html</link><dc:creator>吴剑</dc:creator><author>吴剑</author><pubDate>Tue, 19 Feb 2008 10:17:00 GMT</pubDate><guid>http://www.cnitblog.com/wujian-IT/archive/2008/02/19/39948.html</guid><wfw:comment>http://www.cnitblog.com/wujian-IT/comments/39948.html</wfw:comment><comments>http://www.cnitblog.com/wujian-IT/archive/2008/02/19/39948.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/wujian-IT/comments/commentRss/39948.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/wujian-IT/services/trackbacks/39948.html</trackback:ping><description><![CDATA[<p>看了很多的资料，决定自己写个程序练习练习，于是就自己写了个小程序来练练手：<br>Server端（linux环境下）：<br>#include &lt;stdio.h&gt;<br>#include &lt;unistd.h&gt;<br>#include &lt;string.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;sys/epoll.h&gt;<br>#include &lt;sys/types.h&gt;<br>#include &lt;sys/socket.h&gt;<br>&nbsp;#include &lt;arpa/inet.h&gt;<br>&nbsp;#include &lt;fcntl.h&gt;</p>
<p><br>#define PORT&nbsp;&nbsp;&nbsp;&nbsp;3456<br>#define BACKLOG&nbsp;&nbsp;&nbsp;10<br>#define MAX_EPOLL_FD&nbsp;65535</p>
<p>int CreateTcpListenSocket();<br>int InitEpollFd();<br>void UseConnectFd(int sockfd);<br>void setnonblocking(int sock);</p>
<p>static int listenfd;</p>
<p>int main()<br>{<br>&nbsp;int epoll_fd;<br>&nbsp;int nfds;<br>&nbsp;int i;<br>&nbsp;<br>&nbsp;struct epoll_event events[50];<br>&nbsp;struct epoll_event tempEvent;</p>
<p>&nbsp;int sockConnect;<br>&nbsp;struct sockaddr_in remoteAddr;<br>&nbsp;int addrLen;</p>
<p>&nbsp;addrLen = sizeof(struct sockaddr_in);<br>&nbsp;epoll_fd = InitEpollFd();<br>&nbsp;if (epoll_fd == -1)<br>&nbsp;{<br>&nbsp;&nbsp;perror("init epoll fd error.");<br>&nbsp;&nbsp;exit(1);<br>&nbsp;}</p>
<p>&nbsp;printf("begin in loop.\n");<br>&nbsp;while (1)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;nfds = epoll_wait(epoll_fd, events, 50, 1000);<br>&nbsp;&nbsp;//sleep(3);<br>&nbsp;&nbsp;printf("connect num: %d\n", nfds);<br>&nbsp;&nbsp;if (nfds == -1)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;perror("epoll_wait error.");<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;for (i = 0; i &lt; nfds; i++)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;if (listenfd == events[i].data.fd)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;printf("connected success\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;sockConnect = accept(events[i].data.fd, (struct sockaddr*)&amp;remoteAddr, &amp;addrLen);<br>&nbsp;&nbsp;&nbsp;&nbsp;if (sockConnect == -1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror("accept error.");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;setnonblocking(sockConnect);<br>&nbsp;&nbsp;&nbsp;&nbsp;tempEvent.events = EPOLLIN | EPOLLET;<br>&nbsp;&nbsp;&nbsp;&nbsp;tempEvent.data.fd = sockConnect;<br>&nbsp;&nbsp;&nbsp;&nbsp;if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sockConnect, &amp;tempEvent) &lt; 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror("epoll ctl error.");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;UseConnectFd(events[i].data.fd);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;<br>}</p>
<p>int CreateTcpListenSocket()<br>{<br>&nbsp;int sockfd;<br>&nbsp;struct sockaddr_in localAddr;<br>&nbsp;if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)<br>&nbsp;{<br>&nbsp;&nbsp;perror("create socket fail");<br>&nbsp;&nbsp;return -1;<br>&nbsp;}</p>
<p>&nbsp;setnonblocking(sockfd);<br>&nbsp;<br>&nbsp;bzero(&amp;localAddr, sizeof(localAddr));<br>&nbsp;localAddr.sin_family = AF_INET;<br>&nbsp;localAddr.sin_port = htons(PORT);<br>&nbsp;localAddr.sin_addr.s_addr = htonl(INADDR_ANY);</p>
<p>&nbsp;if (bind(sockfd,&nbsp; (struct sockaddr*)&amp;localAddr, sizeof(struct sockaddr)) == -1)<br>&nbsp;{<br>&nbsp;&nbsp;perror("bind error");<br>&nbsp;&nbsp;return -1;<br>&nbsp;}</p>
<p>&nbsp;if (listen(sockfd, BACKLOG) == -1)<br>&nbsp;{<br>&nbsp;&nbsp;perror("listen error");<br>&nbsp;&nbsp;return -1;<br>&nbsp;}</p>
<p>&nbsp;return sockfd;<br>}</p>
<p>int InitEpollFd()<br>{<br>&nbsp;//epoll descriptor<br>&nbsp;int s_epfd;<br>&nbsp;struct epoll_event ev;<br>&nbsp;</p>
<p>&nbsp;listenfd = CreateTcpListenSocket();</p>
<p>&nbsp;if (listenfd == -1)<br>&nbsp;{<br>&nbsp;&nbsp;perror("create tcp listen socket error");<br>&nbsp;&nbsp;return -1;<br>&nbsp;}</p>
<p>&nbsp;s_epfd = epoll_create(MAX_EPOLL_FD);<br>&nbsp;ev.events = EPOLLIN;<br>&nbsp;ev.data.fd = listenfd;<br>&nbsp;if (epoll_ctl(s_epfd, EPOLL_CTL_ADD, listenfd, &amp;ev) &lt; 0)<br>&nbsp;{<br>&nbsp;&nbsp;perror("epoll ctl error");<br>&nbsp;&nbsp;return -1;<br>&nbsp;}</p>
<p>&nbsp;return s_epfd;<br>}</p>
<p>void UseConnectFd(int sockfd)<br>{<br>&nbsp;char recvBuff[1500];<br>&nbsp;int recvNum = 0;</p>
<p>&nbsp;recvNum = recv(sockfd, recvBuff, 1500, 0);<br>&nbsp;if (recvNum == -1)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;perror("recv error.");<br>&nbsp;&nbsp;return;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;recvBuff[recvNum] = '\0';<br>&nbsp;printf("message: %s \n", recvBuff);<br>}</p>
<p>void setnonblocking(int sock)</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; int opts;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; opts=fcntl(sock,F_GETFL);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; if(opts&lt;0)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perror("fcntl(sock,GETFL)");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; opts = opts|O_NONBLOCK;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; if(fcntl(sock,F_SETFL,opts)&lt;0)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perror("fcntl(sock,SETFL,opts)");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; </p>
<p>}</p>
<p>client端（VC6.0）:<br><br>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;string.h&gt;<br>#include &lt;winsock2.h&gt;<br>//#include &lt;sockets.h&gt;<br>//#include &lt;unistd.h&gt;<br>//#include &lt;sys/types.h&gt;<br>//#include &lt;sys/socket.h&gt;<br>//#include &lt;arpa/inet.h&gt;<br>#pragma comment(lib,"wsock32.lib") <br>#define PORT&nbsp;&nbsp;&nbsp;&nbsp;3456</p>
<p>int main()<br>{<br>&nbsp;int sockfd;<br>&nbsp;struct sockaddr_in remoteAddr;<br>&nbsp;char mesg[] = "This is a client for epoll test";<br>&nbsp;WSADATA wsdata;</p>
<p>&nbsp;memset(&amp;remoteAddr, 0, sizeof(remoteAddr));<br>&nbsp;remoteAddr.sin_family = AF_INET;<br>&nbsp;remoteAddr.sin_port = htons(PORT);<br>&nbsp;remoteAddr.sin_addr.s_addr = inet_addr("10.40.8.15");</p>
<p>&nbsp;<br>&nbsp;WSAStartup(0x0202,&amp;wsdata);</p>
<p>&nbsp;if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;perror("create socket fail.");<br>&nbsp;&nbsp;return -1;<br>&nbsp;&nbsp;}<br>&nbsp;WSAAsyncSelect(sockfd, NULL, NULL, 0);<br>&nbsp;printf("server ip is: %s\n", (char *)inet_ntoa(remoteAddr.sin_addr));</p>
<p>//&nbsp;while (1)<br>//&nbsp;{<br>&nbsp;&nbsp;if (connect(sockfd, (struct sockaddr*)&amp;remoteAddr, sizeof(remoteAddr)) == -1)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;//perror("connect error.");<br>&nbsp;&nbsp;&nbsp;printf("Error code: %d\n", WSAGetLastError());<br>&nbsp;&nbsp;&nbsp;return -1;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;//printf("times\n");<br>//&nbsp;}</p>
<p>&nbsp;printf("connected!\n");<br>&nbsp;while (1)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;send(sockfd, mesg, strlen(mesg), 0);<br>&nbsp;&nbsp;printf("send over\n");<br>&nbsp;&nbsp;Sleep(1000);<br>&nbsp;&nbsp;}<br>}<br></p>
<img src ="http://www.cnitblog.com/wujian-IT/aggbug/39948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/wujian-IT/" target="_blank">吴剑</a> 2008-02-19 18:17 <a href="http://www.cnitblog.com/wujian-IT/archive/2008/02/19/39948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UTF-8, Unicode, GB2312格式串转换之C语言版</title><link>http://www.cnitblog.com/wujian-IT/archive/2007/12/13/37671.html</link><dc:creator>吴剑</dc:creator><author>吴剑</author><pubDate>Thu, 13 Dec 2007 11:21:00 GMT</pubDate><guid>http://www.cnitblog.com/wujian-IT/archive/2007/12/13/37671.html</guid><wfw:comment>http://www.cnitblog.com/wujian-IT/comments/37671.html</wfw:comment><comments>http://www.cnitblog.com/wujian-IT/archive/2007/12/13/37671.html#Feedback</comments><slash:comments>50</slash:comments><wfw:commentRss>http://www.cnitblog.com/wujian-IT/comments/commentRss/37671.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/wujian-IT/services/trackbacks/37671.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（申明：此文章属于原创，若转载请表明作者和原处链接 ）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;author:&nbsp;&nbsp;&nbsp;wu.jian&nbsp;&nbsp;&nbsp;（吴剑）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;English name: Sword<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;date:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2007-12-13<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;purpose:&nbsp;&nbsp;&nbsp;知识共享<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这几天工作上碰到了UTF-8转GB2312的问题，而且是在嵌入式的环境下，没有API可用，查了很多网上的资料，大多调用VC或者linux下自带的接口。在这里我将这两天的工作做个总结。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;总的来说分为两大步（这里就不介绍基础知识了）：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一、UTF8 -&gt; Unicode<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于UTF8和Unicode存在着联系，所以不需要任何库就可以直接进行转换。首先要看懂UTF8的编码格式：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U-00000000&nbsp;-&nbsp;U-0000007F:&nbsp;0xxxxxxx&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U-00000080&nbsp;-&nbsp;U-000007FF:&nbsp;110xxxxx&nbsp;10xxxxxx&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U-00000800&nbsp;-&nbsp;U-0000FFFF:&nbsp;1110xxxx&nbsp;10xxxxxx&nbsp;10xxxxxx&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U-00010000&nbsp;-&nbsp;U-001FFFFF:&nbsp;11110xxx&nbsp;10xxxxxx&nbsp;10xxxxxx&nbsp;10xxxxxx&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U-00200000&nbsp;-&nbsp;U-03FFFFFF:&nbsp;111110xx&nbsp;10xxxxxx&nbsp;10xxxxxx&nbsp;10xxxxxx&nbsp;10xxxxxx&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U-04000000&nbsp;-&nbsp;U-7FFFFFFF:&nbsp;1111110x&nbsp;10xxxxxx&nbsp;10xxxxxx&nbsp;10xxxxxx&nbsp;10xxxxxx&nbsp;10xxxxxx&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前面几个1就代表后面几个字节是属于一起的。如果要解析一长串UTF8格式的字符串，这点就很有用了。下面这个函数就是判断前面几个1的（这里有define APP_PRINT printf，这样当release的时候将这个宏定义为空就行了，不需要一个一个去改，又方便重新调试）：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int GetUtf8ByteNumForWord(u8 firstCh)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u8 temp = 0x80;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int num = 0;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (temp &amp; firstCh)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp = (temp &gt;&gt; 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APP_PRINT("the num is: %d", num);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return num;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;利用这个函数可以得到字符串中那几个字节是一起的。因为UTF8最大只有6个字节，所以就根据返回值来处理这里我只处理了3个字节和1个字节的UTF8的编码，因为一般来说中文在UTF8中是3个字节。<br><br>//将len个字节的UTF8格式的转换成GB2312格式存放在temp预先申请好的缓冲区中<br>void Utf8ToGb2312(const char* utf8, int len, char *temp)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APP_PRINT("utf8-&gt;unicode: \n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APP_PRINT("utf8: [");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int k = 0; k &lt; len; k++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APP_PRINT("%02x ", utf8[k]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APP_PRINT("]\n");<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int byteCount = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int j = 0;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u16 unicodeKey = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u16 gbKey = 0;<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//循环解析<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (i &lt; len)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(GetUtf8ByteNumForWord((u8)utf8[i]))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>case 0:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp[j] = utf8[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byteCount = 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br></strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 2:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp[j] = utf8[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp[j + 1] = utf8[i + 1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byteCount = 2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&nbsp;case 3:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这里就开始进行UTF8-&gt;Unicode<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp[j + 1] = ((utf8[i] &amp; 0x0F) &lt;&lt; 4) | ((utf8[i + 1] &gt;&gt; 2) &amp; 0x0F);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp[j] = ((utf8[i + 1] &amp; 0x03) &lt;&lt; 6) + (utf8[i + 2] &amp; 0x3F);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //取得Unicode的值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&amp;unicodeKey, (temp + j), 2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APP_PRINT("unicode key is: 0x%04X\n", unicodeKey);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//根据这个值查表取得对应的GB2312的值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gbKey = SearchCodeTable(unicodeKey);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APP_PRINT("gb2312 key is: 0x%04X\n", gbKey);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (gbKey != 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//here change the byte<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//不为0表示搜索到，将高低两个字节调换调成我要的形式<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gbKey = (gbKey &gt;&gt; 8) | (gbKey &lt;&lt; 8);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APP_PRINT("after changing, gb2312 key is: 0x%04X\n", gbKey);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy((temp + j), &amp;gbKey, 2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</strong></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byteCount = 3;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br><br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 4:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byteCount = 4;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 5:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byteCount = 5;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 6:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byteCount = 6;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APP_PRINT("the len is more than 6\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i += byteCount;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (byteCount == 1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j += 2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APP_PRINT("utf8: [");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (k = 0; k &lt; j; k++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APP_PRINT("%02x ", temp[k]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APP_PRINT("]\n");<br>}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;二、下面主要谈谈利用查表法来进行Unicode-&gt;GB2312的转换，首先下载码表，一般码表都是将GB2312的放在前面，Unicode放在后面，这样对于我们来说不方便使用，所以我转换了下，将Unicode放在前面，而且按照从小到大排好序。（这里只需要考虑都为两个字节的情况，因为前面的UTF8-&gt;Unicode并没有将单字节的ASCII转换成Unicode）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1)做表：(可以到这里下载：<a href="http://blog.91bs.com/?action=show&amp;id=20">http://blog.91bs.com/?action=show&amp;id=20</a>，这里谢谢<a href="http://blog.91bs.com/"><u><font color=#0000ff>渣渣的猪窝</font></u></a>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个是原来的样子：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x8140&nbsp;0x4E02&nbsp;#CJK UNIFIED IDEOGRAPH<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x8141&nbsp;0x4E04&nbsp;#CJK UNIFIED IDEOGRAPH<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x8142&nbsp;0x4E05&nbsp;#CJK UNIFIED IDEOGRAPH<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;先弄成（这个可以写个小程序来做，我就是在VC上做的，如果需要可以联系我）：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;0x4E02&nbsp;，0x8140&nbsp;}, //CJK UNIFIED IDEOGRAPH<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;0x4E04&nbsp;，0x8141&nbsp;}, //CJK UNIFIED IDEOGRAPH<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;0x4E05&nbsp;，0x8142&nbsp;}, //CJK UNIFIED IDEOGRAPH<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这样就可以把这些放在.h文件中了，下面是我的定义：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef struct unicode_gb<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned short&nbsp;unicode;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned short gb;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} UNICODE_GB;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UNICODE_GB code_table[] =&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;0x4E02, 0x8140&nbsp;},&nbsp;&nbsp; //CJK UNIFIED IDEOGRAPH<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;0x4E04, 0x8141&nbsp;},&nbsp; //CJK UNIFIED IDEOGRAPH<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;0x4E05, 0x8142&nbsp;},&nbsp; //CJK UNIFIED IDEOGRAPH<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;。。。。。。省略<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面这一步也很简单，在VC中用冒泡排序法，对这个数组按照unicode值进行排序，如果需要可以联系我，把最终结果打印出来，在cmd下运行name &gt; 1.txt就输出到文件，这样就有了一个按照unicode排好序的unicode-&gt;gb2312码表。<br><br>&nbsp;&nbsp;&nbsp;int main(int argc, char *argv[])<br>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;int num = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;UNICODE_GB temp;<br>&nbsp;&nbsp;&nbsp;&nbsp;int i = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;int j = 0;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;num = sizeof(code_table) / sizeof(UNICODE_GB);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;printf("struct size: %d | total size: %d | num is: %d \n",&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;sizeof(UNICODE_GB), sizeof(code_table), num);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;for (i = 0; i &lt; num; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (j = 1; j &lt; num - i; j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (code_table[j - 1].unicode &gt; code_table[j].unicode)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.unicode = code_table[j - 1].unicode;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.gb = code_table[j - 1].gb;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code_table[j - 1].unicode = code_table[j].unicode;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code_table[j - 1].gb = code_table[j].gb;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code_table[j].unicode = temp.unicode;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code_table[j].gb = temp.gb;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;printf("here is the code table sorted by unicode\n\n");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;for (i = 0; i &lt; num; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("{\t0x%04X,\t0x%04X\t},\t\n", code_table[i].unicode, code_table[i].gb);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\n\n print over!\n");<br><br>&nbsp;&nbsp;&nbsp;//以下注释掉的其实就是我用来对原来的码表添加，{，}等用的<br>&nbsp;&nbsp;&nbsp;/*<br>&nbsp;&nbsp;&nbsp;&nbsp;char buff[100];<br>&nbsp;&nbsp;&nbsp;&nbsp;char buff_1[100];&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;FILE* fp = NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;FILE *fp_1 = NULL;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;memset(buff, 0, 100);<br>&nbsp;&nbsp;&nbsp;&nbsp;memset(buff_1, 0, 100);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;fp = fopen("table.txt", "rw");<br>&nbsp;&nbsp;&nbsp;&nbsp;fp_1 = fopen("table_1.txt", "a+");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;if ((fp == NULL) || (fp_1 == NULL))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("open file error!\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;while (fgets(buff, 100, fp) != NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buff[8] = ',';</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fputs(buff, fp_1);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;*/</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最后就是搜索算法了，前面已经排好序了，现在我们把排好序的码表放在我们真正需要的.h文件中。大家应该猜我用什么算法搜索了吧，二分法。<br><br>#define CODE_TABLE_SIZE 21791<br>//这个表是死的，所以就直接用宏表示长度，不用每次都用size，不过这样可能对移植性不好。<br>u16 SearchCodeTable(u16 unicodeKey)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;int first = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;int end = CODE_TABLE_SIZE - 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;int mid = 0;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;while (first &lt;= end)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mid = (first + end) / 2;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (code_table[mid].unicode == unicodeKey)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return code_table[mid].gb;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (code_table[mid].unicode &gt; unicodeKey)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end = mid - 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first = mid + 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;到此，已经能够将UTF8串转换成GB2312了。是一长串哦，而不是单个汉字的编码转换。<br><br><br></p>
<img src ="http://www.cnitblog.com/wujian-IT/aggbug/37671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/wujian-IT/" target="_blank">吴剑</a> 2007-12-13 19:21 <a href="http://www.cnitblog.com/wujian-IT/archive/2007/12/13/37671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>倒着拷贝一个文件到另一个文件</title><link>http://www.cnitblog.com/wujian-IT/archive/2007/10/18/35048.html</link><dc:creator>吴剑</dc:creator><author>吴剑</author><pubDate>Thu, 18 Oct 2007 10:17:00 GMT</pubDate><guid>http://www.cnitblog.com/wujian-IT/archive/2007/10/18/35048.html</guid><wfw:comment>http://www.cnitblog.com/wujian-IT/comments/35048.html</wfw:comment><comments>http://www.cnitblog.com/wujian-IT/archive/2007/10/18/35048.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/wujian-IT/comments/commentRss/35048.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/wujian-IT/services/trackbacks/35048.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;<br>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;</p>
<p>int copy_from_back(FILE * srcfd, FILE * dstfd);</p>
<p>int main(int argc, char *argv[])<br>{<br>&nbsp;FILE *srcfd = NULL;<br>&nbsp;FILE *dstfd = NULL;<br>&nbsp;<br>&nbsp;if (argc != 3)<br>&nbsp;{<br>&nbsp;&nbsp;printf("usage: FileStudy srcFiel dstFile\n");<br>&nbsp;}</p>
<p>&nbsp;srcfd = fopen(argv[1], "r");<br>&nbsp;dstfd = fopen(argv[2], "w+");</p>
<p>&nbsp;if (copy_from_back(srcfd, dstfd) == -1)<br>&nbsp;{<br>&nbsp;&nbsp;printf("copy error: ");<br>&nbsp;&nbsp;exit(EXIT_FAILURE);<br>&nbsp;}</p>
<p>&nbsp;return 0;&nbsp;<br>}</p>
<p><br>int copy_from_back(FILE *srcfd, FILE *dstfd)<br>{<br>&nbsp;char ch;<br>&nbsp;int num_read = 0;<br>&nbsp;<br>&nbsp;if (srcfd == NULL || dstfd == NULL)<br>&nbsp;{<br>&nbsp;&nbsp;perror("fopen error: ");<br>&nbsp;&nbsp;return -1;<br>&nbsp;}</p>
<p>&nbsp;fseek(dstfd, 0, SEEK_SET);<br>&nbsp;<br>&nbsp;/*指向文件末尾，如果继续读，返回EOF*/<br>&nbsp;if (fseek(srcfd, 1, SEEK_END) != 0)<br>&nbsp;{<br>&nbsp;&nbsp;perror("fseek error");<br>&nbsp;}&nbsp;<br>&nbsp;else<br>&nbsp;{<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;printf("begin to read file\n");<br>&nbsp;&nbsp;while (ftell(srcfd) &gt; 0)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;char ch = fgetc(srcfd);<br>&nbsp;&nbsp;&nbsp;if (ch == EOF)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;printf("file end!\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;fseek(srcfd, -2, SEEK_CUR);<br>&nbsp;&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;putchar(ch);<br>&nbsp;&nbsp;&nbsp;fputc(ch, dstfd);<br>&nbsp;&nbsp;&nbsp;num_read++;<br>&nbsp;&nbsp;&nbsp;fseek(srcfd, -2, SEEK_CUR);<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;char start = fgetc(srcfd);<br>&nbsp;&nbsp;putchar(start);<br>&nbsp;&nbsp;printf("\nread file end: %d \n", num_read);<br>&nbsp;}</p>
<p>&nbsp;return 0;<br>}</p>
<p>/*<br>int copy_from_back(FILE *srcfd, FILE *dstfd)<br>{<br>&nbsp;char ch;<br>&nbsp;<br>&nbsp;if (srcfd == NULL || dstfd == NULL)<br>&nbsp;{<br>&nbsp;&nbsp;perror("fopen error: ");<br>&nbsp;&nbsp;return -1;<br>&nbsp;}<br>&nbsp;<br>&nbsp;fseek(srcfd, 0, SEEK_SET);<br>&nbsp;<br>&nbsp;while ((ch = fgetc(srcfd)) != EOF)<br>&nbsp;{&nbsp;<br>&nbsp;&nbsp;putchar(ch);<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;fputc(ch, dstfd);&nbsp;<br>&nbsp;&nbsp;fseek(dstfd, 1, SEEK_SET);<br>&nbsp;}</p>
<p>&nbsp;return 0;<br>}<br>*/<br></p>
<img src ="http://www.cnitblog.com/wujian-IT/aggbug/35048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/wujian-IT/" target="_blank">吴剑</a> 2007-10-18 18:17 <a href="http://www.cnitblog.com/wujian-IT/archive/2007/10/18/35048.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>