【问题标题】:ColdFusion Socket Streaming, UTF-8 string not received properly on destinationColdFusion 套接字流,UTF-8 字符串未在目的地正确接收
【发布时间】:2013-06-03 07:25:14
【问题描述】:

我正在使用easySocket udf 和下面的代码通过 tcp/ip 发送实际消息的 2 字节标头长度。然而 UTF-8 字符(即 ( ) (8D hex) 被接收为 ? (3F hex))。我使用了以下代码,我也在stackoverflow上检查过。有没有办法发送相当于长度的字节,这样就不会涉及字符编码?谢谢。

    <cffunction name="easySocket" access="private" returntype="any" hint="Uses Java Sockets to connect to a remote socket over TCP/IP" output="false">

        <cfargument name="host" type="string" required="yes" default="localhost" hint="Host to connect to and send the message">
        <cfargument name="port" type="numeric" required="Yes" default="8080" hint="Port to connect to and send the message">
        <cfargument name="message" type="string" required="yes" default="" hint="The message to transmit">

        <cfset var result = "">
        <cfset var socket = createObject( "java", "java.net.Socket" )>
        <cfset var streamOut = "">
        <cfset var output = "">
        <cfset var input = "">

        <cftry>
            <cfset socket.init(arguments.host,arguments.port)>
            <cfcatch type="Object">
                <cfset result = "#cfcatch.Message#<br>Could not connected to host <strong>#arguments.host#</strong>, port <strong>#arguments.port#</strong>.">
                <cfreturn result>
            </cfcatch>
        </cftry>

        <cfif socket.isConnected()>
            <cfset streamOut = socket.getOutputStream()>

            <cfset output = createObject("java", "java.io.PrintWriter").init(streamOut)>
            <cfset streamInput = socket.getInputStream()>

            <cfset inputStreamReader= createObject( "java", "java.io.InputStreamReader").init(streamInput)>
            <cfset input = createObject( "java", "java.io.BufferedReader").init(InputStreamReader)>


            <cfset output.print(chr(1) & chr(141) & arguments.message)>
            <cfset output.flush()>

            <cfset result='Success: '& arguments.message >
            <cfset socket.close()>
        <cfelse>
            <cfset result = "Could not connected to host <strong>#arguments.host#</strong>, port <strong>#arguments.port#</strong>.">
        </cfif>

        <cfreturn result>
    </cffunction>

    <cfset txt_msg ='<COS MSG_TYPE_ID="0100" MCC="5999" POS_ENTRY_MODE="012" POS_COND="00" CARD_NUMBER="6417801234567890" ACQUIRER_ID="00000002" TERMINAL_ID="CAL100  " PROC_CODE="300000" STAN="000129" RETRIEVAL_REFERENCE="330145181129" DATE_LOCAL_TRAN="1111" TIME_LOCAL_TRAN="173654" TRANSM_DATE_TIME="1111173654" CARD_ACPT_ID_CODE="TESTDTA" CARD_ACPT_NAME_LOC="TSTESTSTE" />'>

    <cfoutput>#easySocket('172.16.0.23','9095',txt_msg)#</cfoutput>

【问题讨论】:

    标签: coldfusion coldfusion-8


    【解决方案1】:

    According to the API, "...如果您省略编码标识符,InputStreamReaderOutputStreamWriter 依赖于默认编码。" - 这可能不是“UTF-8”。在 Windows 机器上通常是Cp1252。您可以通过检查系统属性来查看默认值:

        <cfset system = createObject("java", "java.lang.System")>
        <cfset defaultEncoding = system.getProperty("file.encoding", "unknown")>
    

    .. 或PrintWriter 的编码:

        <cfdump var="#output.getEncoding()#">
    

    无论如何,请尝试在创建输出流时明确指定编码。这应该可以解决问题。

     ... 
     <cfset streamOut = socket.getOutputStream()>
     <cfset writer = createObject("java", "java.io.OutputStreamWriter").init(streamOut, "UTF-8")>
     <cfset output = createObject("java", "java.io.PrintWriter").init(writer)>
     ... 
    

    【讨论】:

    • 明确指定编码实际上是因为我在 TCP/IP 上发送的 chr(141) 接收方式不同。但是,解释我发送的消息的实际长度仍然存在问题。标头是 2 字节长度,然后是实际消息。有没有办法在不使用编码的情况下将实际的字符字节发送到流中?
    • “实际字符字节”是什么意思?不确定我是否关注。
    • 对不起,如果我让您感到困惑,Leigh。我的意思是把一个0-255的整数转换成一个字节,然后通过tcp/ip发送。感谢支持,不胜感激。
    • 有几种创建字节的方法,如javacast("byte", int)binaryDecode(value, "encoding")等。但是我相信 PrintWriter 只处理文本或字符。你可能想试试sending all binary instead
    猜你喜欢
    • 1970-01-01
    • 2019-08-31
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多