跳轉到內容

Zoph/升級/將您的資料庫更改為 UTF-8

來自華夏公益教科書,為開放世界提供開放書籍

從 Zoph v0.8.1 開始,Zoph 使用 UTF-8 字元編碼。為了充分利用此更改,您需要將資料庫也轉換為 UTF-8 編碼;尤其是當您在資料庫中使用任何非拉丁字元時。

重要!

這可能是一個有風險的操作,請確保您備份了資料庫,並且在確定所有內容都正確轉換之前不要刪除它。

將資料庫轉換為 UTF-8

[編輯 | 編輯原始碼]

執行此操作最安全的方法可能是建立一個第二個 Zoph 資料庫並針對它進行測試。本文件將介紹該方法。如果您希望稍後返回舊資料庫名稱,或者由於託管限制只能使用單個數據庫,您將不得不刪除“舊”資料庫並重新使用同一個資料庫。在這種情況下,請仔細檢查您的備份!

建立備份

mysqldump -u root -p zoph | gzip > zoph.sql.gz

建立一個新的資料庫,使用 UTF-8 編碼

mysql -u root -p
mysql> CREATE DATABASE zophutf8 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> exit
重要!

您不能使用ALTER TABLE來執行此操作,因為 MySQL 將將資料庫的字元編碼設定為 UTF-8,但會將其保留在任何它所在的編碼(通常是 Latin-1)上,用於表格

找出您當前的編碼

zcat zoph.sql.gz | grep CHARSET

通常你會看到幾行像這樣的程式碼

) ENGINE=MyISAM DEFAULT CHARSET=latin1;

在這種情況下,我們一直在使用 latin1 編碼。您還會看到某些行包含諸如AUTO_INCREMENT=161的內容,這些現在對我們來說並不重要。

我們現在將在該檔案中將編碼更改為 UTF-8。在我進行的測試中,實際上不需要轉換字元集,只需更改編碼的名稱就足夠了。如果您在更改前後文本正確顯示,但在更改後不再顯示時遇到問題,您可能需要使用iconv進行轉換。如果您確實需要這樣做,請告訴我,或將資訊新增到本文件中。

zcat zoph.sql.gz | sed "s/CHARSET=latin1/CHARSET=utf8/g" | gzip > zophutf8.sql.gz

將資料庫匯入到新建立的資料庫中

zcat zophutf8.sql.gz | mysql -u root -p zophutf8

您需要更新 zoph.ini 並授予您用於連線到 MySQL 的使用者的許可權。

zoph.ini:
db_name = "zophutf8"
db_user = "zoph_rw"
db_pass = "PASSWORD"
mysql -u root -p
mysql> grant select, insert, update, delete on zophutf8.* to zoph_rw@localhost identified by 'PASSWORD';
mysql> grant all on zophutf8.* to zoph_admin identified by 'PASSWORD';

現在,執行其餘的 更新 並測試!

將資料庫名稱改回 zoph

[編輯 | 編輯原始碼]

如果您已經測試並確認新資料庫對您有效,並且您想將資料庫的名稱改回 zoph,則需要執行以下步驟。這些步驟實際上不是必需的,但請記住,將來的 Zoph 文件將使用 zoph 而不是 zophutf8 來引用資料庫。

mysqldump -u root -p zophutf8 | gzip > zophutf8.sql.gz
mysqladmin -u root -p drop zoph
mysql -u root -p
mysql> CREATE DATABASE zoph DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> exit
zcat zophutf8.sql.gz | mysql -u root -p zoph
zoph.ini:
db_name = "zophutf8"
db_user = "zoph_rw"
db_pass = "PASSWORD"
mysql -u root -p
mysql> grant select, insert, update, delete on zoph.* to zoph_rw@localhost identified by 'PASSWORD';
mysql> grant all on zoph.* to zoph_admin identified by 'PASSWORD';

回滾到舊資料庫

[編輯 | 編輯原始碼]

如果您在測試過程中發現數據庫轉換對您無效,您可以透過更改以下內容輕鬆回滾到舊資料庫config.inc.php:

define('DB_NAME', 'zoph')

如果您遇到問題,請 報告錯誤在論壇上發帖

如果您不知道什麼是 UTF-8,這裡提供一些背景資訊。如果您想了解更多資訊,請點選維基百科連結;維基百科頁面上的 字元編碼 也是一個很好的起點。

什麼是 UTF-8?

[編輯 | 編輯原始碼]

UTF-8 是一種編碼字元的方式。

計算機一直在使用 ASCII 編碼,它是一種 7 位編碼,可以容納 128 個不同的字元;其中 33 個用於控制字元(如轉義和退格),因此剩下 96 個用於 26 個小寫字母、26 個大寫字母、10 個數字和少數符號,如標點符號;沒有空間用於“國際”字元,例如 é、ñ 或 ä。這通常被稱為 US-ASCII

但是,當 8 位字元集(通常錯誤地稱為“8 位 ASCII”)開始使用時,出現了大約 127 個字元的額外空間。這似乎很多,但不足以對不同語言中使用的所有不同字元進行編碼。建立了一系列字元集來容納所有字元。最終,這或多或少地標準化為幾十個字元集,其中 Latin-1 或 ISO-8859-1,包含大多數西歐語言所需的字元,可能是最常見的字元集之一。

對於擁有超過 26 個字元(或 255 個字元)的語言,例如中文或日語,也會出現另一個問題。針對這些語言,定義了幾個雙位元組編碼字元集,例如 Big5ISO-2022-JP

在不同字元集之間進行轉換通常是不可能的:除了前 127 個字元(包含“標準”拉丁字母、數字和符號)之外,字元集之間幾乎沒有重疊。此外,計算機需要被告知它正在讀取哪個字元集,例如,Latin-1 中的程式碼 232 是 è,而在 Latin-2 中,它是針對中歐和東歐語言的,它是 č。沒有提示,它不知道如何對其進行解碼。

最終,建立了 UTF-16 來解決這個問題,它是一個雙位元組編碼系統,具有足夠的儲存空間來對當前使用的所有書寫系統進行編碼,並且甚至可以透過使用 32 位,可以編碼的字元數量實際上是無限的。但是,該系統也存在問題:與 ASCII 或 8 位 ASCII 編碼的向後相容性有限,並且任何拉丁字元的文字都需要雙倍的儲存空間(每個字元 16 位,而不是 8 位)。

最終,建立了 UTF-8 來解決這個問題,其中一個字元可以在 8 位、16 位或 32 位中進行編碼,其中 8 位編碼將對應於原始的 7 位 ASCII 集,再加上一個前導零 - 就像在 8 位 ASCII 編碼字元集中一樣。

Zoph 如何處理這個問題?

[編輯 | 編輯原始碼]

Zoph 長期以來一直是一個多語言程式,只是 Zoph 的多語言實現包含一個設計錯誤:Zoph 會根據使用者使用 Zoph 的語言來更改其編碼方案。因此,這意味著使用土耳其語設定的使用者將建立一個相簿,Zoph 將使用 ISO-8859-9 將資料儲存在資料庫中;當另一個使用者使用法語翻譯(因此使用 ISO-8859-1)檢索它時,Zoph 會告訴瀏覽器“這是 ISO-8859-1 編碼的文字”,然後傳送 ISO-8859-9 編碼的文字。這通常不會成為問題,除非使用 US-ASCII 集之外的字元,然後您最終會得到像“Stato della Citt? del Vaticano”,“Česká republika”和“G?teborg”這樣的名稱。

解決方案

[編輯 | 編輯原始碼]

解決此問題的方法是將所有翻譯轉換為 UTF-8,始終使用 UTF-8 編碼與瀏覽器通訊,並將所有資料儲存在資料庫中,使用 UTF-8 編碼。前兩個我已經處理了,但是您需要將資料庫轉換為 UTF-8。

這能解決所有問題嗎?

[編輯 | 編輯原始碼]

不能,如果您當前有上述文字,例如在您的 Zoph 安裝中出現問號或不可讀字元,那麼您可能無法自動消除它們。不幸的是,由於無法知道這是用什麼編碼寫入資料庫的,因此並不總能恢復它們。

但是... 對資料庫的任何未來新增都應該不再存在此問題。(告訴我,如果您遇到問題!)

華夏公益教科書