本文件闡明一些有關如何適當地處理 OpenKore 國際化(不同的 文/字 編碼)的東西。亦請參見 Perl 類型的定義 與 Unicode-processing issues in Perl and how to cope with it。
假如你對於 Unicode/UTF-8 不熟悉,請閱讀 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
Contents |
在 OpenKore 裡,所有包含人類看得懂的文字的變數(換句話說,所有文字字串)都必須是 字串 類型。這些字串在程式內部以 UTF-8 編碼。
最重要的差別在於字串是 字 的序列,而不是位元組的序列。
因為在 OpenKore 裡所有人類能夠閱讀的文字變數必須是字串類型,你得轉換由外部的程式碼送出的資料(像是 RO 伺服器的訊息)為字串。
$string = Encode::decode("Chinese", $bytes)亦請參見 預先定義的編碼名稱的別名。
I18N::UTF8ToString(): $string = I18N::UTF8ToString($utf8_data);
你也需要轉換字串(String)為 UTF-8 或 Unicode 或任何你能傳輸字串的資料至一個外部實體之前的東西。(You also need to convert Strings to UTF-8 or Unicode or whatever before you can pass the string's data to an external entity.)
Bytes 類型。(或 UtfBytes,假如你要轉換為 UTF-8 的話)舉例來說,要轉換一個字串為 UTF-8 bytes 類型:$utfBytes = Encode::encode("utf8", $string);是的我知道這個函數名 "encode()" 有點令人困惑。它們真正的意思是:要去 encode 一個字串成為一個指定的文字編碼。
I18N::stringToUTF8():$utf8_data = I18N::stringToUTF8($string);
資料檔案,像是 config.txt 與 items.txt,必須被編碼為 UTF-8。所以我們要求使用者以 UTF-8 編輯每一樣東西。(這是有可能的:記事本可支援 UTF-8,事實上所有 Linux 的桌面文字編輯器都支援 UTF-8。Linux 擁有 iconv 元件,可讓你輕易地轉換任何東西為 UTF-8。)
要從資料檔案進行讀取,你必須以 UTF-8 模式開啟檔案,藉由 ':utf8' 來做 open()。用以下範例來做示範:
use encoding 'utf8'; open(F, "<:utf8", "data.txt"); ... read data file ...
要寫入字串至資料檔案做法也相同。藉由 ':utf8' 來做 open()。舉例:
use encoding 'utf8'; my $string = getStringToWrite(); # Type: String open(F, ">:utf8", "data.txt"); print F $string; close(F);
每一個處理字串的 Perl 模組裡,你應該要設定 utf8 編碼 pragma:
use encoding 'utf8';
否則,你可能會收到惱人的警告訊息像是 'Wide character in print at xxxxx line yy.',且有些字串可能會變亂掉。
I18N 模組定義了一些編碼名稱的別名,這些別名較容易記住。
| 別名名稱 | 對映 |
|---|---|
| Western | ISO-8859-1 |
| Tagalog | ISO-8859-1 |
| Simplified Chinese | GBK |
| Traditional Chinese | Big5 |
| Korean | CP949 |
| Russian | CP1251 |
| Cyrillic | CP1251 |
| Japanese | Shift_JIS |
| Thai | ISO-8859-11 |
中文支援的注意事項: 正體中文通常使用 Big5 編碼,而簡體中文通常使用 CP936 (GBK)。從 2000 年起,所有大陸地區的中文產品必須支援 GB18030 標準。GB18030 與 GBK 完全相容,但需要龐大的第三方 Perl 模組,所以對於別名使用 GBK 作為替代。
有時候你不想把變數當作是字串,而想當作是二進位資料來處理(舉例來說,當你在應付 raw socket data 時)。使用以下的 pragmas 以強制 Perl 那樣做:
use bytes; no encoding 'utf8';
第一個 pragma 強制 Perl 把所有的字串都當做位元組字串而不是文字字串。 第二個 pragma 用來保證你以目前的詞語上下文裡創造的任何字串將不會被標記為 UTF-8 字串。(The second pragma ensures that any strings you create within the current lexical context will not be marked as UTF-8 strings.)