Python-解码字符串已经以字节为单位

时间:2019-05-08 18:12:06

标签: python python-3.x

我正在尝试一个Python程序读取另一个Python程序发出的单词,该单词已编码为UTF-8并保存在txt文件中。

例如,它获取的字符串可能是:

 public class View_life_science_pdf extends AppCompatActivity 
    {
    ListView lifesciencepdflist;
    DatabaseReference databaseReference;
    List<UploadPDF> uploadPDFS;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_life_science_pdf);

        lifesciencepdflist = findViewById(R.id.life_science_pdfs);
        uploadPDFS = new ArrayList<>();

        viewAllFiles();

        lifesciencepdflist.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                UploadPDF uploadPDF = uploadPDFS.get(position);

                Intent intent = new Intent();
                intent.setData(Uri.parse(uploadPDF.getUrl()));
                startActivity(intent);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

    }

    private void viewAllFiles() {

        databaseReference = FirebaseDatabase.getInstance().getReference("uploads_Life_science_jour");
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for(DataSnapshot postSnapshot : dataSnapshot.getChildren()){

                    UploadPDF uploadPDF = postSnapshot.getValue(com.example.publications.UploadPDF.class);
                    uploadPDFS.add(uploadPDF);
                }

                String[] uploads = new String[uploadPDFS.size()];

                for (int i=0;i<uploads.length;i++)
                {
                    uploads[i]= uploadPDFS.get(i).getPdfname();
                }

                ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(),android.R.layout.simple_list_item_1,uploads)
                {

                    @Override
                    public View getView(int position,  View convertView,  ViewGroup parent) {

                        View view = super.getView(position, convertView, parent);
                        TextView mytext = view.findViewById(android.R.id.text1);
                        mytext.setTextColor(Color.BLACK);

                        return view;
                    }
                } ;
                lifesciencepdflist.setAdapter(adapter);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
}

将其作为普通字符串,例如:

b'\xd1\x84\xd0\xbe\xd1\x80\xd1\x83\xd0\xbc'

如何使脚本看到这是字节字符串而不是普通字符串?我知道这可以像

一样完成
word_string = "b'\xd1\x84\xd0\xbe\xd1\x80\xd1\x83\xd0\xbc'"

但是如果我已经在文件中写入了该变量'word_bytes'的内容,该如何获取它并使程序理解它仅需对其进行解码?因为我尝试对其进行解码,但它说这是一个字符串,无法解码。有帮助吗?

谢谢!

更新:因此,这里放置至少在Windows(我正在使用Windows 7)上从文件中获取字符串的任何人的情况下,使用三位用户的回答,它将编码并加上双反斜杠。在字节部分,并且在解码时,它只会删除其中的一个反斜杠,将其像以前一样放置。因此,从文件中获取并对其进行解码的方法如下:

word_bytes = b'\xd1\x84\xd0\xbe\xd1\x80\xd1\x83\xd0\xbc'

编辑:我想知道的是几乎所有用户想要的答案(丢失了50%),但是这已经是一种方式了,谢谢!但是我怎么办却不知道编码(因为在这种情况下,我不知道编码是latin-1,所以不能将所有编码都放在那儿)?就像我将ab放在'word_bytes'变量中的字节串之前一样(可能它会自动使用正确的编码进行编码?我也想这样做,但是可能对已经具有字节部分的变量进行了功能化)

2 个答案:

答案 0 :(得分:2)

如果变量中已经有 bytes 个,则一切就绪。如果您在字符串中包含字节,我假设您基本上是一个字符序列,其中每个字符的代码点值都等于应该保留的字节值。这恰好是Latin-1编码的定义-感觉有点脏,但是诀窍是将您的字符串编码为Latin-1,然后再解码为UTF-8。

>>> s = '\xd1\x84\xd0\xbe\xd1\x80\xd1\x83\xd0\xbc'
>>> s.encode('latin-1').decode('utf-8')
'форум'

答案 1 :(得分:0)

您可以使用

识别字符串是否以字节为单位
def identifystring(string):
    if isinstance(string, str):
        print ("ordinary string")
    elif isinstance(string, unicode):
        print ("unicode string")
    else:
        print ("no string")