default.aspx
----------------------
private void Page_Load(object sender, System.EventArgs e)
{
string url1 = "http://localhost/Test.asp";
string url2 = "http://localhost/Test.aspx";

string data = 
@"<?xml version=""1.0""?>
<params>
<action>createService</action>
<paramT>中国</paramT>
</params>
";
string strRet = PostXmlToUrl(url1,data);
Response.Write(strRet);
string strRet = PostXmlToUrl(url2,data);
Response.Write(strRet); Response.End();
}protected string PostXmlToUrl(string url,string data)
{
HttpWebRequest hwr = (HttpWebRequest)HttpWebRequest.Create(url);
hwr.Method = "POST"; Stream stream = hwr.GetRequestStream(); StreamWriter sw = new StreamWriter(stream,System.Text.Encoding.UTF8);
sw.Write(data);
sw.Close(); stream = hwr.GetResponse().GetResponseStream(); StreamReader sr = new StreamReader(stream,System.Text.Encoding.UTF8);
string ret = sr.ReadToEnd();
sr.Close(); return ret;

}===================test.aspx
------------------------------
private void Page_Load(object sender, System.EventArgs e)
{
byte[] buf = Request.BinaryRead(Request.ContentLength);
string str = System.Text.Encoding.GetEncoding("utf-8").GetString(buf);
Response.Write(str);
Response.End();
}===========================================test.asp
----------------------------------
<%dim buf ,str
dim ms
buf = Request.binaryRead(Request.TotalBytes)
str = Bytes2bStr(buf)
Response.Write(str)
Response.End()'' Byte流到Char流的转换函数
'' Code By:evlon
'' 参考:忘记了
Function Bytes2BSTR(vin)
Dim ms,strRet Set ms = Server.CreateObject("ADODB.Stream") '建立流对象
ms.Open '默认 adTypeText
ms.WriteText vin            '把vin写入流对象中

ms.Position = 0             '设置流对象的起始位置是0 以设置Charset属性
ms.Charset = "gb2312"       '设置流对象的编码方式为GB2312
ms.Position = 1             '设置流对象的起始位置是1 不知道为什么是1,如果是0,则前面有?出现 strRet = ms.ReadText '取字符流
ms.close                    '关闭流对象
Set ms = nothing Bytes2bStr = strRetEnd Function

%>================================================================
注意
      ms.Charset = "gb2312"  为什么?

解决方案 »

  1.   

    gb2312,UTF-8都是编码集,参考以下说明:UTF8还是GB2312? 
    早些年上网的朋友都知道,NS或IE浏览器早期的版本并不支持多国语言的浏览,如果想浏览繁体中文、日文等外文网站还需要一个如“中文之星”或“四通立方”的外挂软件,后来浏览器逐步发展升级,到目前为止,几乎所有浏览器都支持多国语言字符,可以浏览任意国家、语言的网站。Blog的出现,特别是Trackback的出现,使网络国际化的行为由被动的浏览信息向主动式的交互信息过渡,然而新的语言障碍问题又出现了...问题主要出在Blog的Trackback(引用)、Ping(通告)、Notification(通知书)等交互具有的功能上。以前我们在理解和应用网络上的交互主要局限在C-S范围之内,也就是客户(个人)与服务器(网站)之间的信息交互,例如:在网络上发布一篇文章或回复一个论坛帖子,一般来讲这样的交互很少会出现语言不兼容的问题。然而Blog中的Trackback等的交互方式不只是C-S的,它还是S-S(Blog网站之间)的,甚至是多重的,例如在发布一篇文章的时候,你可以同时选择让它同时发布在一个或多个不同的Blog上,或者给指定的人发出更新通知,也可以让更多的人预订、收录你的RSS内容更新信息。Blog的交互方式更多、更灵活,当然,这种交互并非没有限制,语言编码是一个很大障碍,如果你的Blog系统编码是中文简体的GB2312,那么所有Trackback、Ping的交互对象就只能限于国内采用GB2312编码的用户,你的Blog也就无法与台湾、日本等采用非GB2312编码的用户实现交互。比较好的解决办法是采用UTF-8编码,虽然采用UTF-8编码回多占用一些空间(一个汉字需3个字节),但国际化问题总算解决了,UTF-8兼容GB2312、BIG5、EUC-JP等多种国家的语言编码,经测试,采用UTF-8编码的Blog之间的各种交互、通讯没有任何问题。事实上90%以上的台湾Blog都已经舍弃了BIG5,而采用UTF-8的编码方式,而大陆的Blog几乎还都是GB2312编码,看来台湾在国际化方面还是相当领先的。前几日,我将自己的Blog从GB2312编码转为了UTF-8编码,Trackback和Ping了几个台湾朋友的Blog,没有发现问题。看来“国际化”的问题已经解决了,但随之而来有出现了新的问题,我的Blog与国内GB2312编码的Blog又无法交互了,当然这是必然的。我Ping到online-edu.org(网站采用GB2312编码)上的信息都成了乱码。我想问题到此,已经不是技术层面的了。如果你的站点或Blog有国际化交流的需求,可通过采用UTF-8编码的方式来解决,如果没有这个需求,采用GB2312也无大碍。在用户看来都是一样的,编码只是后台的东西。不过我希望Blogger们最好都采用UTF-8编码,因为你的Blog有了Trackback和Ping,它们可是持有国际航班的机票,如果只在本国转悠,确实很浪费。 
      

  2.   

    我发送页
    StreamWriter sw = new StreamWriter(stream,System.Text.Encoding.UTF8);
    是用的UTF8编码楼上的取的哪个页面,我取得就是我的发送页面呀。且我用的是UTF8编码呀
      

  3.   

    现在改成这个样子了:
    ==================================
    <%
    dim buf ,str
    dim ms
    str = "aaa"
    buf = Request.binaryRead(Request.TotalBytes)
    str = Bytes2bStr(buf)
    call WriteFileLog("log\log.txt",str)
    Response.Write(str)Response.End()'' Byte流到Char流的转换函数
    '' Code By:evlon
    '' 参考:忘记了
    Function Bytes2BSTR(vin)
    Dim ms,strRet Set ms = Server.CreateObject("ADODB.Stream") '建立流对象
    ms.Open '默认 adTypeText
    ms.WriteText vin            '把vin写入流对象中

    ms.Position = 0             '设置流对象的起始位置是0 以设置Charset属性
    ms.Charset = "utf-8"       '设置流对象的编码方式为utf-8
    ms.Position = 8             '设置流对象的起始位置是8 不知道为什么是8,如果是0,则前面有?出现
    ' ms.Charset = "gb2312"       '设置流对象的编码方式为GB2312
    ' ms.Position = 8             '设置流对象的起始位置是8 不知道为什么是8,如果是0,则前面有?出现 strRet = ms.ReadText '取字符流
    ms.close                    '关闭流对象
    Set ms = nothing Bytes2bStr = strRetEnd Function'''将信息写到一个文本文件里
    Sub WriteFileLog(sFilename,sMsgContent)
        '''参数说明:
    ''      sMsgContent:信息内容
    ''        sFilename:相对当前目录的文件名
    Dim sMsg,str ,arr
    Dim fs,sPage,sFile
    Dim sCopName,sDeptName,sUserName,sPath
    Set fs=Server.CreateObject("Scripting.FileSystemObject") sMsg=cstr(now) & " " & chr(13) & chr(10) & sMsgContent
    if left(sFileName,1)<>"\" then 
    sFileName="\" & sFileName
    end if

    sPath=Server.MapPath("./")

    arr=split(sFileName,"\")
    for each str in arr
    if(trim(str)<>"") then 
    sPath = sPath & "\" & str
    if instr(str,".")>0 then
    '''先判断文件是否存在,如果不存则新建一个
    IF NOT fs.FileExists(sPath) Then
    fs.CreateTextFile sPath,True
    End IF
    else
    IF NOT fs.FolderExists(sPath) Then
    fs.CreateFolder sPath
    End IF
    end if
    end if
    next Set sFile=fs.OpenTextFile(sPath,8)
    sFile.WriteLine sMsg    
    Set sFile=Nothing
    Set fs=Nothing
    End Sub
    %>
    ====================
    运行结果
     2005-8-10 9:32:35
    <?xml version="1.0" encoding="utf-8"?>
    <params>
      <Action>createService</Action>
      <ServiceGuid>hb0311002_02</ServiceGuid>
      <paramT>30</paramT>
      <paramS>0</paramS>
      <paramC>0</paramC>
      <paramOther>aaa=5</paramOther>
      <hashcode>52D75B704990233DB8DC727E406A6E09</hashcode>
      <timestamp>63259263155578125018120</timestamp>
    </params>
    2005-8-10 9:32:35
    <?xml version="1.0" encoding="utf-8"?>
    <params>
      <Action>changeService</Action>
      <sequenceId>2342134124123412124124124</sequenceId>
      <ServiceGuid>hb0311002_02</ServiceGuid>
      <paramT>30</paramT>
      <paramS>0</paramS>
      <paramC>0</paramC>
      <paramOther>aaa=4444;b=我来这时在是什么时的事情了</paramOther>
      <hashcode>B390FFB9A5128BD8BA281E03E2506774</hashcode>
      <timestamp>632592631556562500614402</timestamp>
    </params>
    2005-8-10 9:32:35
    <?xml version="1.0" encoding="utf-8"?>
    <params>
      <Action>pauseService</Action>
      <sequenceId>2342134124123412124124124</sequenceId>
      <hashcode>3DF9CDA8374037EC93741FE2046D6602</hashcode>
      <timestamp>632592631556718750748735</timestamp>
    </params>
    2005-8-10 9:32:35
    <?xml version="1.0" encoding="utf-8"?>
    <params>
      <Action>continueService</Action>
      <sequenceId>2342134124123412124124124</sequenceId>
      <hashcode>C8B73AB4FEDCA5F1C055DFF8EE3677A4</hashcode>
      <timestamp>632592631556718750279378</timestamp>
    </params>
    2005-8-10 9:32:35
    <?xml version="1.0" encoding="utf-8"?>
    <params>
      <Action>cancelService</Action>
      <sequenceId>2342134124123412124124124</sequenceId>
      <hashcode>01E0242AAF05BD2E56B181E51372B978</hashcode>
      <timestamp>63259263155687500054464</timestamp>
    </params>
      

  4.   

    用utf-8取,ms.Position = 8             '设置流对象的起始位置是8不知道为什么了?
    反正现在没有乱码了
      

  5.   

    原来是方法错误,
    流中有字符集格式如:UTF-8:FF FE 在网上找到相关解决方法如下:
    =============================================
    'Stream_BinaryToString Function
    '2003 Antonin Foller, http://www.pstruh.cz
    'Binary - VT_UI1 | VT_ARRAY data To convert To a string
    'CharSet - charset of the source binary data - default is "us-ascii"
    Function Stream_BinaryToString(Binary, CharSet)
      Const adTypeText = 2
      Const adTypeBinary = 1  'Create Stream object
      Dim BinaryStream 'As New Stream
      Set BinaryStream = CreateObject("ADODB.Stream")  'Specify stream type - we want To save text/string data.
      BinaryStream.Type = adTypeBinary  'Open the stream And write text/string data To the object
      BinaryStream.Open
      BinaryStream.Write Binary
      'Change stream type To binary
      BinaryStream.Position = 0
      BinaryStream.Type = adTypeText  'Specify charset For the source text (unicode) data.
      If Len(CharSet) > 0 Then
        BinaryStream.CharSet = CharSet
      Else
        BinaryStream.CharSet = "us-ascii"
      End If  'Open the stream And get binary data from the object
      Stream_BinaryToString = BinaryStream.ReadText
    End Function
      

  6.   

    至少有三种以上办法,可以把二进制数据(比如您从ASP的Request.BinaryRead方法得到的数据)转换为字符串。第一种:使用VBS的MultiByte 方法实例:Function SimpleBinaryToString(Binary)
      'SimpleBinaryToString converts binary data (VT_UI1 | VT_ARRAY Or MultiByte string)
      'to a string (BSTR) using MultiByte VBS functions
      Dim I, S
      For I = 1 To LenB(Binary)
        S = S & Chr(AscB(MidB(Binary, I, 1)))
      Next
      SimpleBinaryToString = S
    End Function这个方法非常简单明了,但是处理大数据流时,比较慢。
    建议只用来处理100KB以下的数据。
    下面的这个类似的方法,性能稍微好些:
    Function BinaryToString(Binary)
      'Antonin Foller, http://www.pstruh.cz
      'Optimized version of a simple BinaryToString algorithm.  Dim cl1, cl2, cl3, pl1, pl2, pl3
      Dim L
      cl1 = 1
      cl2 = 1
      cl3 = 1
      L = LenB(Binary)  Do While cl1<=L
        pl3 = pl3 & Chr(AscB(MidB(Binary,cl1,1)))
        cl1 = cl1 + 1
        cl3 = cl3 + 1
        If cl3>300 Then
          pl2 = pl2 & pl3
          pl3 = ""
          cl3 = 1
          cl2 = cl2 + 1
          If cl2>200 Then
            pl1 = pl1 & pl2
            pl2 = ""
            cl2 = 1
          End If
        End If
      Loop
      BinaryToString = pl1 & pl2 & pl3
    End Function
    BinaryToString方法比SimpleBinaryToString方法性能高20倍。建议用来处理2MB以下的数据。
    第二种方法:使用ADODB.Recordset
    ADODB.Recordset 可以让你支持几乎所有VARIANT支持的数据类型,你可以用它在string和
    binary之间转换。
    Function RSBinaryToString(xBinary)
      'Antonin Foller, http://www.pstruh.cz
      'RSBinaryToString converts binary data (VT_UI1 | VT_ARRAY Or MultiByte string)
      'to a string (BSTR) using ADO recordset  Dim Binary
      'MultiByte data must be converted To VT_UI1 | VT_ARRAY first.
      If vartype(xBinary)=8 Then Binary = MultiByteToBinary(xBinary) Else Binary = xBinary  Dim RS, LBinary
      Const adLongVarChar = 201
      Set RS = CreateObject("ADODB.Recordset")
      LBinary = LenB(Binary)  If LBinary>0 Then
        RS.Fields.Append "mBinary", adLongVarChar, LBinary
        RS.Open
        RS.AddNew
          RS("mBinary").AppendChunk Binary
        RS.Update
        RSBinaryToString = RS("mBinary")
      Else
        RSBinaryToString = ""
      End If
    End Function
    RSBinaryToString 没有什么限制--除了物理内存之外。这种处理方式是MultiByte方式的100倍!你可以用它来处理高达100MB的数据! 这种转换方式,你也可以用来把MultiByte strings转换为String。下面这个方法把MultiByte strings转换为Binary:Function MultiByteToBinary(MultiByte)
      '&copy; 2000 Antonin Foller, http://www.pstruh.cz
      ' MultiByteToBinary converts multibyte string To real binary data (VT_UI1 | VT_ARRAY)
      ' Using recordset
      Dim RS, LMultiByte, Binary
      Const adLongVarBinary = 205
      Set RS = CreateObject("ADODB.Recordset")
      LMultiByte = LenB(MultiByte)
      If LMultiByte>0 Then
        RS.Fields.Append "mBinary", adLongVarBinary, LMultiByte
        RS.Open
        RS.AddNew
          RS("mBinary").AppendChunk MultiByte & ChrB(0)
        RS.Update
        Binary = RS("mBinary").GetChunk(LMultiByte)
      End If
      MultiByteToBinary = Binary
    End Function
    第三种:使用ADODB.Stream这种方式是比较常用的:'Stream_BinaryToString Function
    '2003 Antonin Foller, http://www.pstruh.cz
    'Binary - VT_UI1 | VT_ARRAY data To convert To a string
    'CharSet - charset of the source binary data - default is "us-ascii"
    Function Stream_BinaryToString(Binary, CharSet)
      Const adTypeText = 2
      Const adTypeBinary = 1  'Create Stream object
      Dim BinaryStream 'As New Stream