Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python UTF-8文本到Android_Android_Python_Python 2.7_Utf 8 - Fatal编程技术网

Python UTF-8文本到Android

Python UTF-8文本到Android,android,python,python-2.7,utf-8,Android,Python,Python 2.7,Utf 8,我想通过套接字将使用ElasticSeach存储的UTF-8文本发送到应用程序 我实现了一个ThreadedTCPServer,下面是应该处理回复的类 我已经实现了基本的基于字符串的握手,以共享一些信息,如查询已发送,响应将被发送 class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler): def handle(self): es = Elasticsearch() #receive q

我想通过套接字将使用ElasticSeach存储的UTF-8文本发送到应用程序

我实现了一个ThreadedTCPServer,下面是应该处理回复的类

我已经实现了基本的基于字符串的握手,以共享一些信息,如查询已发送,响应将被发送

class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):

    def handle(self):
       es = Elasticsearch()
       #receive query from the client
       query = self.request.recv(1024)
       #Cut off the characters that aren't recognized
       query=query[2:]
       #for testing
       query=query.lower().strip().replace(' ','_')
       print query
       #Send response that query was received
       self.request.send("200...OK\n")
       res = es.search(index="painters",body={"query": { "match" :   {"title" : query}},"size":1  })
       if res['hits']['hits']:
           response = res['hits']['hits'][0]['_source']['text']
           self.request.send("201...RE\n")
       print response
       response=response.encode('utf-8')
       self.request.sendall(response)
在android端,我有两个函数,一个用于读取响应,另一个用于读取字节

    private String getResponse(InputStream is){
        String line="";
        BufferedReader rd = new BufferedReader(new InputStreamReader(is),8);
        try{
            line=rd.readLine();
        }
        catch (Exception e){
            Toast.makeText(MainActivity.this, "Stream Exception", Toast.LENGTH_SHORT).show();
        }
        return line;
    }

    private String convertStreamToString(InputStream is) {
        BufferedInputStream bi = new BufferedInputStream(is);
        byte[] b = new byte[1024];
        StringBuilder total = new StringBuilder();
        try {
            while (bi.read(b,0,1024)!=-1)
            {
                total.append(decodeUTF8(b));
                Log.d("TOTAL",decodeUTF8(b));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return total.toString();
    }
下面是应该解码字符串的函数:

String decodeUTF8(byte[] bytes) {
    return new String(bytes, UTF8_CHARSET);
}
 @Override
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);

    //get message
    Intent intent = getIntent();
    String summary = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
问题是,有时并不是整个字符串都显示在android端, 当整个过程经过时,一些UTF-8字符最终会变形(与sent完全不同的字符)

启动新活动的AsyncTask post execute:

    protected void onPostExecute(String s) {
        //super.onPostExecute(s);
        if (s.contains("ECONNREFUSED")){
            Toast.makeText(MainActivity.this,"Connection Failed",Toast.LENGTH_LONG).show();
            return;
        }
        Intent intent = new Intent(MainActivity.this,ReplyActivity.class);
        intent.putExtra(EXTRA_MESSAGE,s);
        startActivity(intent);
    }
获取字符串的新意图:

String decodeUTF8(byte[] bytes) {
    return new String(bytes, UTF8_CHARSET);
}
 @Override
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);

    //get message
    Intent intent = getIntent();
    String summary = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
输出示例:

早年生活(1928–1949)

安迪·沃霍尔(“nÔ安德烈·瓦霍拉,Jr.)于1928年8月6日出生于宾夕法尼亚州匹兹堡。他是安德烈·沃霍拉(美国化为安德鲁·沃霍拉,老,1889–1942年)和杰里娅(“nÃe”扎瓦克•1952–1972年)的第四个孩子

正如您所看到的,即使在将查询从android发送到python时,我也会收到一些需要切掉的废话

在这里:

报告员(答复):

早年(1928\xe2\x80\x931949)\nAndy Warhol(“n\xc3\xa9”Andrej Varhola,Jr.)于1928年8月6日出生于宾夕法尼亚州。他是Andrij Warhola(美国化为Andrew Warhola,Sr.,1889\xe2\x80\x931942)和(“n\xc3\xa9e”Zavack\xc3\xa1,1892\xe2\x80\x931972)的第四个孩子他的第一个孩子出生在他们的家乡,在他们移居美国之前就去世了。
终端打印:

<h2>Early life (1928–1949)</h2>
Andy Warhol ("né" Andrej Varhola, Jr.) was born on August 6, 1928 in <a href="Pittsburgh">Pittsburgh</a>, Pennsylvania. He was the fourth child of Andrij Warhola (Americanized as Andrew Warhola, Sr., 1889–1942) and <a href="Julia Warhola">Júlia</a> ("née" Zavacká, 1892–1972), whose first child was born in their homeland and died before their move to the U.S.
早期生活(1928-1949)
安迪·沃霍尔(“né”Andrej Varhola,Jr.)于1928年8月6日出生于宾夕法尼亚州。他是安德烈·沃霍拉(1889-1942年被美国化为安德鲁·沃霍拉)和(“née”Zavacká,1892-1972年)的第四个孩子,他们的第一个孩子出生在自己的家乡,在移居美国之前去世。

您有一个Mojibake;将UTF-8数据解码为CP-1252(欧元符号将其标记为Windows代码页,而不是ISO-8859-1)。由于您显然是在发送UTF-8,因此问题必须在Android端,或者在数据创建点。您能给我们
repr(响应)的输出吗
请?我怀疑您的ElasticSearch数据已经损坏。@MartijnPieters-问题的补充是
repr()的文本输出
调用
响应
变量?这当然是UTF-8编码的数据,但我缺少字符串周围的引号。那里还没有Mojibake,所以问题似乎出在Android端。@MartijnPieters-我打印了repr(响应)到终端并复制与示例输出相等的部分,因为这是一篇完整的Wikipedia文章。粘贴整个内容太长。这里是结尾:n\n'和开始:'Andy Warhol\n\nAndy Warhol(;8月6日