Python - Unicode De/Encode
Python - Unicode De/Encode
我如何传递所有来自创建数据库输入的内容 (s1),从那里加载它 (s2) 并将其正确地返回格式传递给文件?
import time,os,sys,base64
s = "Hello World!\r\nHeyho"
#with s1 i make an input to the database; with s2 I select it -> works most time
s1 = base64.b64encode(s.encode("UTF-8")).decode("UTF-8") #print("Base64 Encoded:", s1)
s2 = base64.b64decode(s1.encode("UTF-8")).decode("UTF-8") #print(s2)
#example that I try to save it in a file:
s3 = "PGhlYWQ+CiAgICA8dGl0bGU+4pa3IEltbW9iaWxpZW4gLSBIw6R1c2VyIC0gV29obnVuZ2VuIC0gZmluZGVuIGJlaSBpbW1vd2VsdC5kZTwvdGl0bGU+"
with open("C:\Users\001\Downloads\Output.txt", "w") as text_file:
text_file.write("Ausgabe: %s" % base64.b64decode(s3.encode("UTF-8")).decode("UTF-8")) #with .encode('ascii', 'ignore') i whould delete the signs
日志:
C:\Users[=13=]1\Downloads>python trythis.py
Traceback (most recent call last):
File "trythis.py", line 11, in <module>
text_file.write("Ausgabe: %s" % base64.b64decode(s3.encode("UTF-8")).decode("UTF-8")) #with .encode('ascii', 'ignore') i whould delelte signs
File "C:\Users[=13=]1\AppData\Local\Programs\Python\Python35\lib\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u25b7' in position 28: character maps to <undefined>
编辑:我正在研究 windows。
C:\Users[=14=]1\Downloads>python -V
Python 3.5.2
404pio 似乎是正确的。您的代码 运行 在我的系统中与 Python 3 没问题。可能发生的情况是 Windows 在 运行 python trythis.py
时将 Python 2 作为默认值
您将在
找到您的 Python 3 安装
C:\Users\YourUserName\AppData\Local\Programs\Python\
目录,它应该有一个名为 Python37-32 或类似名称的文件夹。在该文件夹的 bin
目录中使用 Python 3 二进制文件(通过在命令提示符
中指定完整路径
C:\Users\YourUserName\AppData\Local\Programs\Python\Python37-32\bin\python trythis.py
或将该文件夹添加到您的 PATH 环境变量(并从中删除 python 2 路径)。
Link 如何修改 PATH 变量 https://www.java.com/en/download/help/path.xml
问题是您以文本模式打开文件,但没有指定编码。在这种情况下,使用系统默认编码,这在任何系统上都可能不同。
解决方法:将encoding
参数指定为open()。
作为旁注:你为什么 .decode('UTF-8')
?它 确实 有效,但由于数据是 Base64 编码的,我认为 ASCII 解码会更有意义。此外,你应该只在 I/O 边界处 encode/decode (所以在这种情况下写入文件时),尽管你可能只是在这种情况下出于 testing/demonstration 目的而这样做。
更新:
显然,您的 Base64 编码数据也是 UTF-8 编码的(首先是 UTF-8,然后是 Base64),因此您需要先进行 Base64 解码,然后再进行 UTF-8 解码。
以下是一个可移植的工作示例:
import base64
b64_encoded_text = 'PGhlYWQ+CiAgICA8dGl0bGU+4pa3IEltbW9iaWxpZW4gLSBIw6R1c2VyIC0gV29obnVuZ2VuIC0gZmluZGVuIGJlaSBpbW1vd2VsdC5kZTwvdGl0bGU+'
decoded_text = base64.b64decode(b64_encoded_text).decode('utf-8')
with open('Output.txt', 'wt', encoding='utf-8') as text_file:
text_file.write('Ausgabe: %s' % decoded_text)
尽管将原始二进制(UTF-8 编码)数据写入文件更容易:
import base64
b64_encoded_text = 'PGhlYWQ+CiAgICA8dGl0bGU+4pa3IEltbW9iaWxpZW4gLSBIw6R1c2VyIC0gV29obnVuZ2VuIC0gZmluZGVuIGJlaSBpbW1vd2VsdC5kZTwvdGl0bGU+'
with open('Output.txt', 'wb') as file:
# file.write(b'Ausgabe: ') # uncomment if really needed
file.write(base64.b64decode(b64_encoded_text))
我如何传递所有来自创建数据库输入的内容 (s1),从那里加载它 (s2) 并将其正确地返回格式传递给文件?
import time,os,sys,base64
s = "Hello World!\r\nHeyho"
#with s1 i make an input to the database; with s2 I select it -> works most time
s1 = base64.b64encode(s.encode("UTF-8")).decode("UTF-8") #print("Base64 Encoded:", s1)
s2 = base64.b64decode(s1.encode("UTF-8")).decode("UTF-8") #print(s2)
#example that I try to save it in a file:
s3 = "PGhlYWQ+CiAgICA8dGl0bGU+4pa3IEltbW9iaWxpZW4gLSBIw6R1c2VyIC0gV29obnVuZ2VuIC0gZmluZGVuIGJlaSBpbW1vd2VsdC5kZTwvdGl0bGU+"
with open("C:\Users\001\Downloads\Output.txt", "w") as text_file:
text_file.write("Ausgabe: %s" % base64.b64decode(s3.encode("UTF-8")).decode("UTF-8")) #with .encode('ascii', 'ignore') i whould delete the signs
日志:
C:\Users[=13=]1\Downloads>python trythis.py
Traceback (most recent call last):
File "trythis.py", line 11, in <module>
text_file.write("Ausgabe: %s" % base64.b64decode(s3.encode("UTF-8")).decode("UTF-8")) #with .encode('ascii', 'ignore') i whould delelte signs
File "C:\Users[=13=]1\AppData\Local\Programs\Python\Python35\lib\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u25b7' in position 28: character maps to <undefined>
编辑:我正在研究 windows。
C:\Users[=14=]1\Downloads>python -V
Python 3.5.2
404pio 似乎是正确的。您的代码 运行 在我的系统中与 Python 3 没问题。可能发生的情况是 Windows 在 运行 python trythis.py
您将在
找到您的 Python 3 安装C:\Users\YourUserName\AppData\Local\Programs\Python\
目录,它应该有一个名为 Python37-32 或类似名称的文件夹。在该文件夹的 bin
目录中使用 Python 3 二进制文件(通过在命令提示符
C:\Users\YourUserName\AppData\Local\Programs\Python\Python37-32\bin\python trythis.py
或将该文件夹添加到您的 PATH 环境变量(并从中删除 python 2 路径)。
Link 如何修改 PATH 变量 https://www.java.com/en/download/help/path.xml
问题是您以文本模式打开文件,但没有指定编码。在这种情况下,使用系统默认编码,这在任何系统上都可能不同。
解决方法:将encoding
参数指定为open()。
作为旁注:你为什么 .decode('UTF-8')
?它 确实 有效,但由于数据是 Base64 编码的,我认为 ASCII 解码会更有意义。此外,你应该只在 I/O 边界处 encode/decode (所以在这种情况下写入文件时),尽管你可能只是在这种情况下出于 testing/demonstration 目的而这样做。
更新:
显然,您的 Base64 编码数据也是 UTF-8 编码的(首先是 UTF-8,然后是 Base64),因此您需要先进行 Base64 解码,然后再进行 UTF-8 解码。
以下是一个可移植的工作示例:
import base64
b64_encoded_text = 'PGhlYWQ+CiAgICA8dGl0bGU+4pa3IEltbW9iaWxpZW4gLSBIw6R1c2VyIC0gV29obnVuZ2VuIC0gZmluZGVuIGJlaSBpbW1vd2VsdC5kZTwvdGl0bGU+'
decoded_text = base64.b64decode(b64_encoded_text).decode('utf-8')
with open('Output.txt', 'wt', encoding='utf-8') as text_file:
text_file.write('Ausgabe: %s' % decoded_text)
尽管将原始二进制(UTF-8 编码)数据写入文件更容易:
import base64
b64_encoded_text = 'PGhlYWQ+CiAgICA8dGl0bGU+4pa3IEltbW9iaWxpZW4gLSBIw6R1c2VyIC0gV29obnVuZ2VuIC0gZmluZGVuIGJlaSBpbW1vd2VsdC5kZTwvdGl0bGU+'
with open('Output.txt', 'wb') as file:
# file.write(b'Ausgabe: ') # uncomment if really needed
file.write(base64.b64decode(b64_encoded_text))