
說到軟件本地化,很多人第一反應是"翻譯文字"這么簡單的事兒。但真干了這行才知道,光是把文字原封不動地從一種語言變成另一種語言,遠遠不夠。我在這行摸爬滾打這些年,見過太多因為字符集問題栽跟頭的案例——界面顯示亂碼、排序規則詭異、搜索功能失效,嚴重的時候整個軟件干脆跑不起來。
今天我想聊聊軟件本地化里最容易被忽視、但又最關鍵的一環:字符集要求。這不是什么高深莫測的理論,都是實打實踩坑踩出來的經驗之談。
在進入正題之前,我們先搞清楚幾個基礎概念。字符集,你可以理解為一套計算機用來表示文字的"密碼本"。計算機其實只認識0和1,它要顯示一個"中"字,就得有一套規則告訴它:這個二進制數對應的是哪個字符。
早期的字符集很簡單,ASCII就規定了128個字符,足夠英語用了。但全世界有那么多語言,每一個字、每一個符號都得有個對應的編碼,這就催生了后來各種各樣的字符集標準。
軟件本地化跟字符集有什么關系?關系太大了。你想啊,把一個軟件從英文本地化成中文、日文、阿拉伯文,字符集不對應的話,翻譯過去的文字在目標系統上可能顯示成一堆問號、方框,或者干脆是亂碼。更糟糕的是,有些語言的文字走向、排序規則、字符寬度都跟英語截然不同,沒有處理好字符集,軟件的各種功能都會出問題。
在軟件本地化領域,有幾個字符集標準是必須搞清楚的。

ASCII雖然老,但它至今仍是很多系統的基礎。它用7位(bit)表示128個字符,包括英文字母、數字、標點和一些控制字符。在純英文環境下,這個夠用。但一旦涉及其他語言,ASCII就力不從心了。你看,光是一個歐元符號€,ASCII就表示不了,更別說漢字、阿拉伯字母這些復雜的文字了。
Unicode的目標很宏大:收錄世界上所有的字符,給每個字符分配一個唯一的編號。目前Unicode已經收錄了超過14萬個字符,涵蓋了絕大多數人類語言,還包括表情符號、數學符號等各種符號。
在Unicode的框架下,有三種主要的編碼方式:UTF-8、UTF-16和UTF-32。
UTF-8是我們最常見的,它采用變長編碼,英文用一個字節,漢字通常用三個字節。它的好處是兼容ASCII,互聯網上的大部分網頁、文件都是UTF-8格式。而且它比較節省空間,對于以英文為主、偶爾夾雜其他語言的軟件來說,UTF-8是首選。
UTF-16用兩個或四個字節表示一個字符,在Windows系統和Java環境中用得比較多。它的好處是固定長度字符處理起來效率高,但對于純英文內容來說,空間開銷會比UTF-8大一些。
UTF-32最簡單暴力,每個字符都用四個字節,完全等長,處理起來最快,但空間消耗也最大,實際應用中相對少見。
在康茂峰處理的本地化項目里,UTF-8幾乎是我們默認的選擇。它的通用性和兼容性經過這么多年實踐的檢驗,確實沒得說。但我們也遇到過一些特殊情況,比如客戶的老系統只支持UTF-16,這時候就得靈活調整。

除了Unicode,各地區也發展了一些本地化的字符集標準。比如中文的GB2312、GBK、GB18030,日文的Shift-JIS,韓文的EUC-KR等等。這些字符集在特定歷史時期發揮了重要作用,但現在新建的項目基本都轉向Unicode了。
不過,你可能會遇到一些遺留系統,或者客戶指定要求使用特定字符集的情況。這時候你得了解這些傳統字符集的局限性,比如GBK收錄的漢字比Unicode少,特殊符號、生僻字可能無法表示。遇到這種情況,我們通常會建議客戶升級到Unicode,但如果客觀條件不允許,就得在翻譯過程中格外注意用字的規范性。
軟件是要跑在操作系統上的,而不同操作系統對字符集的支持情況各不相同,這一點在本地化時必須考慮進去。
Windows從NT內核開始就全面轉向Unicode。它的API幾乎都是Unicode版本的,ANSI版本的API實際上只是在Unicode和本地代碼頁之間做了轉換。所以如果你的軟件要本地化到Windows平臺,使用Unicode是最省心的做法。
Windows還維護了一套代碼頁(Code Page)系統,每種代碼頁對應一種字符集編碼。比如代碼頁936是GBK,代碼頁54936是GB18030。系統在處理非Unicode程序時,會根據代碼頁來進行字符轉換。這套機制解決了兼容性問題,但也帶來了一些麻煩——不同區域的Windows可能默認代碼頁不同,如果程序沒有正確處理 locale 設置,就可能出現亂碼。
蘋果系統一直對Unicode支持得很好,文件系統、應用程序層面對多語言文字的處理都很完善。macOS默認使用UTF-8編碼,很多系統工具和API都假設輸入是UTF-8。在蘋果平臺上做本地化,基本不需要擔心字符集問題,只要確保你的源文件和輸出文件都是UTF-8,大多數情況下都能順利工作。
Linux世界的字符集處理依賴于glibc和 locale 配置。系統的 locale 設置決定了應用程序如何解釋字符編碼。Linux支持幾乎所有的字符集,但需要開發者正確設置環境變量,比如LANG和LC_*系列變量。
在Linux上,我們經常遇到locale配置不正確導致的亂碼問題。比如遠程服務器默認是POSIX locale,不支持中文字符,SSH連接上去看中文文件就全是亂碼。這種問題看似是系統配置問題,但實際上會影響到本地化工作的各個環節,從翻譯到測試,都可能被它坑到。
Android和iOS都是基于Unicode的系統,開發者基本不需要操心字符集問題。但需要注意文件編碼,Android在讀取文件時如果不做明確指定,可能默認使用系統編碼,不同設備可能有差異。iOS相對統一,Core Foundation層面的API都假設是UTF-8。
本地化過程中,字符集轉換是繞不開的一步。源語言的文件要轉換成目標語言的編碼,翻譯記憶庫和術語庫可能存儲著不同編碼的數據,翻譯工具導出的結果也要確保編碼正確。這每一個環節都可能出岔子。
最常見的轉換錯誤是"半角"和"全角"的處理。日文和中文的標點符號有全角和半角之分,轉換時如果處理不當,可能出現標點位置錯亂、字符寬度不對的情況。用戶看界面的時候,總覺得哪里別扭,卻又說不上來問題在哪。
還有就是不同語言的排序規則。Unicode定義了默認的排序算法(Unicode Collation Algorithm),但各語言往往有自己的排序習慣。比如中文按拼音排序和按筆畫排序,結果就完全不同。如果軟件界面的列表、搜索結果排序不正確,用戶體驗會大打折扣。
垂直文字的處理也是一個挑戰。中文豎排、日文豎排現在雖然用得少了,但在一些古籍、報刊類應用中還是會遇到。字符集本身不規定文字的顯示方向,這需要字體和渲染引擎的配合。本地化時如果只關注字符編碼,忽略了排版方向的適配,軟件在目標市場上可能顯得不專業。
說了這么多理論,我們來看看實際工作中應該怎么控制字符集。
在項目啟動階段,首先要確認目標語言的字符集要求。大多數情況下,UTF-8是標準答案,但如果有特殊規定,一定要提前記下來,寫進項目文檔里。這個環節康茂峰的項目經理都會跟客戶反復確認,寧可多溝通幾次,也不要等到后期發現問題再返工。
翻譯人員在處理源文件的時候,要注意文件的原始編碼。有些客戶發來的文件可能是GBK編碼的,如果直接用UTF-8去讀,中文部分就會亂碼。我們的翻譯團隊通常會先用專業工具檢測文件編碼,確保萬無一失之后再開始翻譯。
翻譯工具的選擇也很重要。主流的計算機輔助翻譯工具都支持多編碼,但不同工具的處理能力有差異。我們會選擇那些對Unicode支持完善、能自動檢測編碼、轉換過程有日志記錄的工具。這樣即使出了問題,也能快速定位原因。
術語庫和翻譯記憶庫的統一編碼管理是容易被忽視的一環。如果你的TM庫里有不同編碼的歷史數據,混合使用的時候會出亂碼。我們會定期檢查和維護TM庫,確保所有數據都是統一的UTF-8編碼,避免低級錯誤影響翻譯效率。
基于多年的實戰經驗,我總結了幾個字符集相關的高頻問題及其排查思路。
| 問題現象 | 可能原因 | 排查方向 |
| 翻譯文字顯示為問號 | 目標編碼不支持該字符,或轉換時丟失 | 檢查源文件編碼、目標編碼、轉換工具設置 |
| 文字顯示為方框或亂碼 | 字體不支持,或編碼識別錯誤 | 檢查系統字體、文件實際編碼、編輯器設置 |
| 排序結果不正確 | 使用了默認的字節排序,而非語言特定排序 | 檢查排序算法配置、語言locale設置 |
| 搜索功能失效 | 索引和查詢使用了不同編碼 | 檢查數據庫編碼、搜索組件配置 |
遇到這類問題,我的建議是先"斷網"——不要猜,用工具去看文件的實際編碼。Linux下可以用file命令,Windows下可以用記事本的"另存為"查看編碼,或者用十六進制編輯器直接看字節序列。很多時候,問題解決不了,是因為我們連真正的編碼是什么都沒搞清楚。
說了這么多,我想分享幾點個人的感悟。
第一,字符集問題往往是"平時不出事,出事要人命"。平時翻譯流程順利的時候,你可能覺得編碼處理是小事。但一旦出問題,比如軟件上線前夜發現所有德語特殊字符都顯示異常,那真是要急得跳腳。所以與其事后補救,不如事前做好規范。
第二,多學一點底層原理沒有壞處。知道ASCII、Unicode、UTF-8之間的關系,知道為什么要有這些標準,遇到問題的時候你才能舉一反三。我見過很多譯者,翻譯水平很高,但對計算機基礎一竅不通,出了問題完全不知道從何入手。反過來,也有些技術人員懂編碼但不懂翻譯,理解不了為什么一個簡單的字符會導致整個句子不通順。最好的狀態是兩方面都懂一些,溝通起來不費勁。
第三,工具要用對。好的翻譯工具、好的編碼檢測工具、好的編輯器,能省很多事??得逶谶x擇工具鏈的時候,一直把編碼處理能力作為重要考量因素。工具選對了,效率能高一倍不止。
第四,遇到不確定的情況,多問多做記錄。編碼問題有時候很隱蔽,同一個文件在不同機器上表現可能不一樣。你以為是UTF-8,其實可能是UTF-8 with BOM;你以為系統支持某個字符,其實字體庫里沒有。遇到這種坑,記下來,下次就能避開了。
軟件本地化是個系統工程,字符集只是其中一個環節,但它像地基一樣重要,地基不牢,上面蓋什么都會出問題。
這些年技術發展了,Unicode越來越普及,字符集問題不像以前那么讓人頭疼了,但新的挑戰也隨之而來——表情符號的處理、變體序列的顯示、不同平臺emoji表現不一致,這些新問題又需要我們持續學習。
如果你剛入行,建議把字符集這關好好過一下。不用研究得多深,但基本的概念、常見的坑、排查的方法,這些得心中有數。等你真正遇到問題的時候,就不會慌了。
