Sockets 如何使用c+中的Indy TIdTCPServer以UTF-8格式发送文本+;建设者

Sockets 如何使用c+中的Indy TIdTCPServer以UTF-8格式发送文本+;建设者,sockets,java-me,character-encoding,indy10,Sockets,Java Me,Character Encoding,Indy10,我的客户端j2me应用程序使用UTF-8读取文本输入流 reader = new InputStreamReader(in,"UTF-8"); 我的服务器在连接时使用以下语句发送文本 AContext->Connection->IOHandler->WriteLn(cxMemo1->Text,TEncoding::UTF8); 但是结果文本显示了奇怪的字符,比如 我哪里做错了 另外,当我试图以这种方式从utf-8编码数据文件加载时 AContext->Conne

我的客户端j2me应用程序使用UTF-8读取文本输入流

reader = new InputStreamReader(in,"UTF-8");
我的服务器在连接时使用以下语句发送文本

AContext->Connection->IOHandler->WriteLn(cxMemo1->Text,TEncoding::UTF8);
但是结果文本显示了奇怪的字符,比如

我哪里做错了

另外,当我试图以这种方式从utf-8编码数据文件加载时

AContext->Connection->IOHandler->WriteFile("c:\\fids.xml");

都一样

Indy 10完全支持UTF-8编码。我自己使用过它的TIdFTP组件&成功上传了Unicode文本文件。根据我的理解:

  • 您的连接/传输类型设置为
    ftASCII
    ,而不是
    ftBinary
  • 您的J2ME小程序/主机平台不支持UTF-8

  • 当数据通过Unicode到Ansi转换为不支持转换的Unicode字符的Ansi字符集时,会出现“?”字符

    您使用的是什么版本的C++Builder?在CB2009之前的版本中,您应该告诉Indy您正在传递的AnsiString数据的编码。对于大多数基于字符串的操作,Indy默认为ASCII(即:
    TIdTextEncoding::ASCII
    )。可以在需要时使用可选的
    aansicodeding
    参数、
    TIdIOHandler::devansiencoding
    属性或全局
    Idglobal::GIdDefaultAnsiEncoding
    设置来覆盖。如果未指定正确的编码,则在将AnsiString数据转换为UTF-8之前,可能无法将其正确转换为Unicode。例如:

    AContext->Connection->IOHandler->WriteLn(cxMemo1->Text, TIdTextEncoding_UTF8, TTIdTextEncoding_Default);
    
    或:

    如果不想在每次调用时指定UTF-8编码,还可以选择使用
    TIdIOHandler::DefStringEncoding
    属性:

    AContext->Connection->IOHandler->DefStringEncoding = TIdTextEncoding_UTF8;
    AContext->Connection->IOHandler->WriteLn(cxMemo1->Text);
    
    话虽如此,
    WriteFile()
    也在发送J2ME没有正确处理的数据,这一事实告诉我Indy不是问题的根源。WriteFile()只是将原始文件数据按原样复制到连接,而不进行任何解释。如果发送UTF-8编码的文件,那么UTF-8编码的八位字节将被发送到J2ME

    我建议您使用数据包嗅探器(如Wireshark)来验证Indy发送的数据。这会告诉你印地是否真的有错


    *注意:在上面的例子中,我使用了Indy的
    TIdTextEncoding
    宏,而不是直接使用
    TEncoding
    。这是因为Indy的TIdTextEncoding逻辑解决了Embarcadero的
    TEncoding
    类中的一些错误。此外,我们将逐步取消Indy 11中对
    TEncoding
    的直接支持,并扩展到
    TIdTextEncoding
    ,这样Indy比Embarcadero提供的控制更大。

    我使用以下代码建立了连接
    String URL=“socket://”+ServerIP+:“+ServerPort;套接字=(流连接)连接器。打开(URL)我知道这些功能强大的组件比我想象的要多得多,但问题是我在这里做错了smth。编辑:我想更改我原来的帖子,Indy仍在开发如何有效地处理Unicode(由Remy提供)。您可能希望尝试使用Write()。TransferType仅适用于
    TIdFTP
    组件,而不适用于
    TIdTCPServer
    组件。无论如何@nbaztec我正在使用LWUIT!它支持UTF-8吗?我在谷歌上搜索了一下,还没找到!我使用C++ Builder 2010!同样,这种方式也没有帮助
    尝试{int b=AContext->Connection->IOHandler->ReadByte();result->Items->Add(b);//AContext->Connection->IOHandler->WriteFile(“c:\\fids.xml”);AContext->Connection->IOHandler->DefStringEncoding=TIdTextEncoding::UTF8;AContext->->Connection->IOHandler->Write(cxmone1->Text);AContext->Connection->Disconnect();}catch(Exception&e){//ShowMessage(e.ToString());AContext->Connection->Disconnect();}
    您所做的只是添加对
    IOHandler->ReadByte()
    的调用,对于如何将数据发送回J2ME,您没有做任何更改。您仍然需要找出问题的根本原因。您是否按照我的建议进行了验证,并验证了原始传输数据?在任何情况下,我都知道
    Write(UnicodeString,TIdTextEncoding::UTF8)
    在CB2010中运行良好,因为这是我自己使用的版本。顺便说一句,像您这样直接在
    TIdTCPServer
    事件处理程序中读取
    cxmome1->Text
    属性不是线程安全的,因此这本身可能是一个因素。我使用了portable Wireshark,但无法输入正确的筛选器来仅显示发送的所需数据包,然后我分配了socks,但我想我的捕获是混淆的。你知道你的服务器正在监听哪个IP/端口,你可以过滤它。或者只需找到一个您识别数据的数据包,然后右键单击它并选择“跟随流”即可查看该连接的所有数据包。
    AContext->Connection->IOHandler->DefStringEncoding = TIdTextEncoding_UTF8;
    AContext->Connection->IOHandler->WriteLn(cxMemo1->Text);