📄 subject_64802.htm
字号:
<p>
序号:64802 发表者:ytduan 发表日期:2003-12-12 21:56:03
<br>主题:vc使用的字符集问题
<br>内容:网络传输使用ISO8859-1字符集,vc程序发送的TCP包,是否需要转码,然后发送,还是本身就是ISO8859-1字符集,可以直接发送?vc程序接收到ISO8859-1字符集的TCP包后,是否需要转码,还是可以直接处理?<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:BigJames 回复日期:2003-12-13 01:13:59
<br>内容:TCP传输的是字节流。和内容无关。如果你发的是字节流,就不需要转码
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:ytduan 回复日期:2003-12-13 14:58:29
<br>内容:我还不是不明白,传输的是字节流,但可能要用的字符集不一样。网络传输用的是ISO8859-1字符集。通信的一端本地使用的是GB2312字符集。我这一端是用VC开发的,因为传输的包中有汉字,不知道VC使用的字符集是否是ISO8859-1字符集。如果是,当然不用转码,但如果vc的默认字符集是GB2312或其他字符集,那就要转码了<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:BigJames 回复日期:2003-12-13 15:18:00
<br>内容:不用转码。<BR>TCP只负责传输字节流,传输的内容有应用层程序来负责解释。<BR>无论你把中文,希伯莱文还是其他编码的内容放到tcp中,tcp只管把这个字节流送到目标机器的tcp栈中,目标机器的tcp栈会把这个字节流原封不动的传给上面的应用层。<BR>所以, 源机能够发送中文,送给目标机器的就是中文,只要目标机器的应用层能够解释中文就可以了。<BR>在发送端,即使你有中文,也就是2个字节代表一个汉字。tcp会原封不动的把这2个字节传送到目标机器,和编码没有关系!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:ytduan 回复日期:2003-12-13 17:23:56
<br>内容:谢谢你这么耐心的给我解释。<BR>可能我说的不太清楚。<BR>vc本身的是ISO8859-1,网络传输要去的也是ISO8859-1,不用转码。<BR>但是我发送的数据可能是从数据库取的,编码是GBK,是否在发送前要先转成ISO8859-1,然后再发送呢?因为网络传输要求的是ISO8859-1,而不是GBK。对方收到后,使认为手的数据是ISO8859-1的,而不是GBK的。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:BigJames 回复日期:2003-12-13 17:53:03
<br>内容:对于tcp堆栈而言,他看到的只是BYTE*<BR>发送端的应用层需要把数据(不管什么类型,编码)转换成byte*<BR>接受端的应用层应该有足够的知识知道她收到的byte*是什么类型/编码,转换的工作也是有应用层来做的。<BR><BR>重复一遍,tcp只负责传送byte字节流,他对编码一无所知。<BR>比如:CString strChineseName = "汉字";<BR>调用send的时候,send(socket, (const char*)strChineseName, strChineseName.GetLength() * 2, ..)。<BR>就可以了。<BR>要注意的是,首先你需要能够把发送的数据转换成byte* 或者char*,在上面的例子里是由CString自动做的,至于特殊类型,特殊处理。<BR>还有就是长度,必须是以char为单位的长度。<BR><BR>接受端收到的也是一个char*,那么它应该知道收到的数据是什么编码的,tcp本身不会包含这个提示。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:ytduan 回复日期:2003-12-13 18:05:43
<br>内容:比如我们要发送"汉字"这两个字(四个字节),它的ISO8859-1的字节可能是abcd,而GB2312的<BR>字节序可能是efgh,网络传输使用ISO8859-1字符集,那发送的就应该是abcd,但是我的数据从数据库取出来时是编码的也就是efgh,那必须把他转化成abcd,是不是这样.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:BigJames 回复日期:2003-12-13 18:46:27
<br>内容:不是这样。不用象你说的那样转化。直接按字节发就行。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -