[英]In Python, how to replace all non-UTF-8 characters in a string?
更新:真正的問題是MySQL utf8不支持四字節UTF-8字符。
關於這個主題有幾個問題,但它們似乎都不是我的問題,除了可能是這個 ,接受的答案對我不起作用。
我使用MySQLdb
模塊在Python中編碼,我想將一些文本放入MySQL數據庫。 數據庫配置為UTF-8,但文本偶爾包含 非UTF-8 四字節UTF-8字符。
用於數據庫修改的Python代碼如下所示:
connection = MySQLdb.connect(
'localhost',
'root',
'',
'mydatabase',
charset='utf8',
use_unicode=True)
cursor = connection.cursor()
cursor.execute(
'update mytable set entryContent=%s where entryName=%s',
(entryContent, entryName))
connection.commit()
它目前產生這個警告:
./myapp.py:233: Warning: Invalid utf8 character string: 'F09286'
(entry, word))
./myapp.py:233: Warning: Incorrect string value: '\xF0\x92\x86\xB7\xF0\x92...' for column 'entry' at row 1
(entryname, entrycontent))
當我使用mysql
命令行客戶端查看實際進入數據庫的內容時,我看到內容在第一次出現時被截斷 非UTF-8 四字節UTF-8字符。
我不在乎保留 非UTF-8 四字節UTF-8字符,所以我想做的就是全部替換 非UTF-8 四字節UTF-8字符和一些其他有效的UTF-8字符,所以我可以將文本放入數據庫。
事實證明問題並不是我向MySQL提供非UTF-8字符,而是當我只支持三個(和更少)字節UTF-8字符時,我向MySQL提供四字節UTF-8字符( 根據到這個文件 )
此解決方案保留所有支持的UTF-8字符,並將不支持的UTF-8字符轉換為“?”:
>>> print ''.join([c if len(c.encode('utf-8')) < 4 else '?' for c in u'Cognates include Hittite 𒆷𒀀𒈠𒀭 (lāman)'])
Cognates include Hittite ???? (lāman)
我可以將此字符串放入MySQL而不會出現上述警告(以及不合需要的截斷)。
您需要將表格編碼設置為utf8mb4
以支持4字節UTF-8編碼 - https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html
此外,MySQL驅動程序支持Unicode字符串,因此您應該傳遞Unicode以從編碼細節中釋放您的代碼:
例如
cursor.execute(u'update mytable set entryContent=%s where entryName=%s',
(entryContent.decode("utf-8"), entryName.decode("utf-8")))
理想情況下,當您第一次收到entryContent
和entryName
時,您的代碼中的entryContent
和entryName
將被解碼為Unicode。 例如,打開文件或從網絡接收時。
你能用正則表達式刪除非ascii字符嗎? 在評論中使用您的示例:
>>> entry = 'Cognates include Hittite 𒆷𒀀𒈠𒀭 (lāman)'
>>> entry = ''.join([char if ord(char) < 128 else '' for char in entry])
>>> print entry
Cognates include Hittite (lman)
這是對不同問題的這種答案的輕微變化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.