Sockets 如何使用c+中的Indy TIdTCPServer以UTF-8格式发送文本+;建设者
我的客户端j2me应用程序使用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
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
当数据通过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);