字符編碼

呢個頁面為您講解字符編碼係咩,同埋應該點樣運用正確的編碼。

■ 總概

字符編碼指嘅係將文字翻譯成存儲到磁槃上的二進制代碼的方式。 在電腦最早被發明的時候, 文本中每個字符被一個字節表示, 但一個字節的數據量只能表示256種字符。 因此, 隨著全世界的人們開始使用電腦, 為咗畀當地嘅文字都可以儲埋去電腦度, 啲人發明咗好多種完全不同的字符編碼方式。 問題就在於此, 如果一段文字數據的編碼方式未俾過出定, 誤解了編碼就會導致亂碼字符出現。

係一段日文文字, 以 Shift_JIS 編碼 (如無法顯示請安裝合適嘅日文字體)

ひらがなカタカナ漢字

呢個係佢畀 Shift_JIS 方式編碼後產生嘅字節數據:

82 D0 82 E7 82 AA 82 C8 83 4A 83 5E 83 4A 83 69 8A BF 8E 9A

如果字節序列被誤解為ISO 8859-1(Latin-1)而不是Shift_JIS,會發生以下情況:

‚Ђç‚a‚ȃJƒ^ƒJƒiŠ¿Žš

一般來說, 一種字符編碼方式設計時只囊括了特定一種書寫系統的字符, 十分不便。 因此, 人們發明了 Unicode, 即萬國碼, 一種幾乎囊括了全球所有書寫系統中字符的編碼方式, 來解決呢個問題。

雖然 Unicode 時至今日已經被廣泛採用, 用起來還是會有些問題。 首先, Unicode 其實並不昰一種字符編碼, 而 Unicode 轉換格式 (UTF) 才是真正編碼文字的方式。 常用嘅轉換格式為 UTF-16 同 UTF-8。

路線同列車文件, 由于歷史兼容性原因, 可以以任何字符編碼存儲。 由於無法知曉定相應嘅編碼, 就需要玩家對此技術知識有所瞭解, 並在遊戲菜單中人工選擇正確的字符編碼。 好麻煩, 因此必須避免使用 Unicode 以外的字符編碼。

■ 字節順序記號

UTF-16 源於一個使用兩個字節嚟編碼一個字符的編碼方式 (UTC-2), 因此知道兩個字節儲埋嘅柯打就好重要。 為了便於判斷順序, 好多文本編輯器會默認自動喺文字前端添加字節順序記號。 記號可令解碼器收到文件以何種順序儲存, 仲可提供一個較為不易誤判嘅判定文字是否係以 Unicode 編碼的方式。 話人话就係雖然字節順序標記在 UTF-8 入面唔一定都唔畀 Unicode 官方建議, 但寫 OpenBVE 路線時係建議加上緊嘅, 係為咗便於檢測編碼。

雖然並不一定都不被官方推薦, UTF-8 都經常使用字節序。 因為 UTF-8 並不需要區分字節既order, 呢度字節順序標記嘅意義係明顯地說明該文件以 UTF-8 編碼存儲。

如前所述, 雖然 Unicode 允許對世上所有書寫系統中使用的幾乎所有字符進行編碼, 但如果真要使用的編碼沒有達成一致, 則不一定令處理文本文件變得更容易。

使用字節順序標記使 OpenBVE 能夠自動檢測每個單獨文檔的編碼。 如果你用咗個唔錯嘅文本編輯器, 你不僅可以手動選擇編碼, 仲可選擇是否添加字節順序標記。 記事簿 (Windows 中) 以緊 UTF-8 編碼保存文件時成日添加字節順序標記, 也是一個可接受嘅例子。

下面就係技術內容了。 從技術層面來說, 字節順序標記係一個文件最前端的幾個字節。 openbve 能夠自動檢測字節既順序標記為:

編碼 十六進制值
UTF-8 EF BB BF
UTF-16 (big endian) FE FF
UTF-16 (little endian) FF FE
UTF-32 (big endian) 00 00 FE FF
UTF-32 (little endian) FF FE 00 00

OpenBVE 鼓勵您總是以帶字節序嘅 Unicode 字符編碼保存文件, 以便自動識別。 譯者推薦您使用帶 BOM 的 UTF-8。