Support OpenKore:
Learn about
the Fund Pool

OpenKore 的國際化支援

English | 正體中文


本文件闡明一些有關如何適當地處理 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)為 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.)


資料檔案

資料檔案,像是 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);


設定 utf8 編碼 pragma

每一個處理字串的 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.)