如何正确地将编码改为cp866?

时间:2017-08-21 15:47:31

标签: python encoding python-3.6

我正在尝试打印UTF-8和cp866进程输出。

我的代码:

if "sendcmd " in message.text:
    command = message.text.replace("sendcmd ", "")
    process = os.popen(command)
    answer = process.read()
    #print(answer.decode('utf-8').encode('cp866'))
    by = bytes(answer, 'utf-8')
    print(type(by))
    print(repr(by))
    process.close()

在此之后我明白了:

<class 'bytes'>
b'b\'\\xe2\\x80\\x9c\\xd0\\xb1\\xd0\\x87\\xd2\\x90\\xd0\\xb5: \\xd0\\x8b\\xd0\\xb2\\xd0\\x87\\xd0\\xb0\\xc2\\xa0\\xd1\\x9e\\xc2\\xab\\xd2\\x90\\xc2\\xad \\xd0\\xb1\\xd0\\x81\\xd0\\x88\\xc2\\xad\\xc2\\xa0\\xc2\\xab \\xc2\\xa7\\xc2\\xa0\\xd1\\x9e\\xd2\\x90\\xd0\\xb0\\xd0\\xb8\\xd2\\x90\\xc2\\xad\\xd0\\x81\\xd0\\xbf \\xd0\\x87\\xd0\\xb0\\xc2\\xae\\xd0\\xb6\\xd2\\x90\\xd0\\xb1\\xd0\\xb1\\xd0\\xb3 "whatever.exe" \\xd0\\xb1 \\xd0\\x81\\xc2\\xa4\\xd2\\x90\\xc2\\xad\\xd0\\xb2\\xd0\\x81\\xd0\\xb4\\xd0\\x81\\xd0\\x84\\xc2\\xa0\\xd0\\xb2\\xc2\\xae\\xd0\\xb0\\xc2\\xae\\xc2\\xac 3720.\\n\'

我明白我需要将编码更改为cp866,但我不明白如何实现它=(

更新:此代码没有帮助:

uni = type(by), repr(by)
print(uni.encode('ascii', 'ignore'))

1 个答案:

答案 0 :(得分:1)

== 20170821153121 DeviseCreateAdminUsers: migrating =========================== -- create_table(:admin_users) rails aborted! StandardError: An error has occurred, this and all later migrations canceled: SQLite3::SQLException: table "admin_users" already exists: CREATE TABLE "admin_users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "email" varchar DEFAULT '' NOT NULL, "encrypted_password" varchar DEFAULT '' NOT NULL, "reset_password_token" varchar, "reset_password_sent_at" datetime, "remember_created_at" datetime, "sign_in_count" integer DEFAULT 0 NOT NULL, "current_sign_in_at" datetime, "last_sign_in_at" datetime, "current_sign_in_ip" varchar, "last_sign_in_ip" varchar, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL) /Users/admin/.rvm/gems/ruby-2.4.1/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:91:in `initialize' /Users/admin/.rvm/gems/ruby-2.4.1/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:91:in `new' /Users/admin/.rvm/gems/ruby-2.4.1/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:91:in `prepare' /Users/admin/.rvm/gems/ruby-2.4.1/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:137:in `execute' ... 的{​​{1}}方法返回os.popen,进程的输出会自动解码。 readstr类似,可以自定义;它返回原始subprocess.Popen而不是os.popen文字:

bytes

在内部,str使用from subprocess import Popen, PIPE if "sendcmd " in message.text: ... process = Popen(command, stdout=PIPE) answer = process.communicate()[0] # (stdout, stderr) print(answer.decode('cp866')) 模块,您可能需要稍微更改os.popen参数。检查subprocess的{​​{3}}。