簡體   English   中英

在Python中,如何替換字符串中的所有非UTF-8字符?

[英]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")))

理想情況下,當您第一次收到entryContententryName時,您的代碼中的entryContententryName將被解碼為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM