2012-08-14 19 views
0

我有一個MySQL安裝程序,其中所有的表/字段和字符集設置是UTF-8,除了從SqlAlchemy連接。如何確定在更改連接字符集時是否應該編碼?

我最近將連接字符集更改爲UTF-8,以便隨處使用UTF-8

當變更設置時,在DB舊值渲染錯誤,如:

Björn => Björn 

這是沒有問題的,我只是收集值,並對其進行編碼,使用python的編碼方法,以及把它們放回去。

當我嘗試轉換設置更改後插入的值時,會出現問題,這些值已經正確。

有沒有一種很好的方法來確定我是否應該編碼值?

+0

有沒有防彈的方法來猜測基於數據的編碼 - 編碼檢測非常棘手,取決於您的語料庫,您可能會得到誤報。 – 2012-08-14 09:09:45

回答

0

你的舊編碼,大概是拉丁語1?

您可能可以通過查看連續字節來檢測字符串是否用Latin-1編碼而不是UTF-8。在UTF-8標有distinctive codepage layout,我們可以用它來檢測,如果某一段文字,用拉丁字母-1或UTF-8編碼:

  • 範圍00-7F任何字節是安全的當然,這些是ASCII值,並且這兩個編碼點在兩種編碼之間匹配。沒有幫助在這裏,沒有需要幫助。

  • 使用UTF-8編碼的字節C0,C1和F5-FF是非法。任何包含這些字符串的字符串必須是Latin-1編碼。

  • 範圍內的字節C2-DF 必須是後面跟着一個80-BF範圍內的字節。如果您有任何兩個字節不符合您的要求,那麼您的手上可能會有一個Latin-1編碼的字符串。

如果您曾經編碼過的是Latin-1字符(最高爲Unicode代碼點255),您可以在此停止;包含E0-FF範圍內的字節的任何東西都將是舊的Latin-1數據。

如果沒有在UTF-8添加數據,因爲你交換,那是Latin-1的範圍之外,你需要包含以下規則太:

  • 字節在E0-EF範圍標記一個3字節的UTF-8字符。接下來的兩個字節必須再次落入80-BF的範圍。

3 UTF-8字節數據涵蓋了其餘的BMP,你不可能在這之外進行編碼。如果你在這之外做了編碼,尋找:

  • F0-F4範圍內的字節在80-BF範圍內必須緊跟3個字節。

如果所有這些標準都匹配了,你可能一個UTF-8字符串,但你不能100%確定。如果他們中的任何一個確實有而不是匹配,你肯定有一個Latin-1字符串。但是,Latin-1碼點C2-DF不太可能遵循碼點80-BF,因爲後者中的大多數是控制碼或更深奧的變音標記。也許您可以通過查找多個2字節的UTF-8序列來進一步縮小範圍,以提高您的置信度。

因此,總結(t1; dr):通過查看多字節序列,您可以找到大部分 Latin-1編碼的字符串。如果它們不符合嚴格的UTF-8標準,那麼您的手上就會有拉丁語-1字符串。

相關問題