
去年冬天,我一個做跨境電商的朋友急匆匆地找我訴苦。他的網(wǎng)站剛上線德語版本,結(jié)果德國客戶反饋說產(chǎn)品描述里的特殊字符全亂碼了——" Gr??e "顯示成" Gr???e ",看得人一頭霧水。更糟的是,搜索功能居然無法正確匹配德語關(guān)鍵詞,訂單轉(zhuǎn)化率直接掉了一半。
這事兒讓我深刻意識到,網(wǎng)站本地化遠不是簡單的翻譯工作。字符集這個看起來技術(shù)化的東西,一旦處理不當(dāng),就會讓前期所有努力付諸東流。今天我想把這個話題聊透,說清楚網(wǎng)站本地化服務(wù)到底對多語言字符集有什么要求,為什么這些要求如此重要。
在說要求之前,我覺得有必要先把這倆概念講清楚。費曼說過,如果不能用簡單的話解釋一件事,說明你還沒真正理解它。
簡單來說,字符集就像是一本字典,規(guī)定了哪些數(shù)字代碼對應(yīng)哪些字符。比如在ASCII里,65對應(yīng)大寫字母A,97對應(yīng)小寫字母a。而編碼則是把這本"字典"翻譯成計算機能理解的二進制數(shù)據(jù)的方式。
這么說可能還是有點抽象。我給你打個比方:字符集就像世界各國使用的文字系統(tǒng),而編碼就是把這些文字轉(zhuǎn)換成計算機能存儲和傳輸?shù)母袷降囊?guī)則。不同的編碼方式就像不同的翻譯官,同一個字符交給不同的翻譯官處理,可能得到完全不同的結(jié)果。
早期計算機因為主要在美國發(fā)展,ASCII字符集足夠滿足需求。但隨著互聯(lián)網(wǎng)全球化,問題來了——歐洲語言有變音符號,俄語有西里爾字母,阿拉伯語從右往左寫,中文、日文、韓文更是成千上萬的字符。這就像讓一個只懂英語的人去翻譯聯(lián)合國所有文件,壓根兒不現(xiàn)實。

做網(wǎng)站本地化服務(wù)這些年,我見過太多因為字符集處理不當(dāng)導(dǎo)致的"車禍現(xiàn)場"。這些問題往往不是單點的,而是系統(tǒng)性的。
這是最直觀的問題。如果你的網(wǎng)站使用的字符集沒有包含目標語言的全部字符,那用戶看到的就會是問號、方框,或者干脆什么都不顯示。
舉個具體的例子,ISO-8859-1(Latin-1)字符集是西歐語言的常用選擇,但它沒有覆蓋中文。想象一下,一個中文用戶打開你的產(chǎn)品頁面,看到的不是"筆記本電腦",而是一串"????????",會是什么感受?
更隱蔽的是,某些語言的部分字符可能恰好在目標字符集中缺失。比如芬蘭語有個字母"?",在一些老舊系統(tǒng)中就無法正確顯示。這就像你去餐廳吃飯,菜單上寫著"有魚",但實際上只有鯉魚沒有鱸魚——顧客的體驗會大打折扣。
這個問題藏在水面之下,很多人在網(wǎng)站上線初期根本發(fā)現(xiàn)不了。
你的網(wǎng)站內(nèi)容存在數(shù)據(jù)庫里,如果數(shù)據(jù)庫的字符集設(shè)置和網(wǎng)頁的編碼不一致,中文就可能變成亂碼。關(guān)鍵是,這種亂碼可能在某些條件下才會觸發(fā),比如用戶注冊時輸入特殊字符,或者搜索包含變音符號的關(guān)鍵詞。
我曾經(jīng)見過一個案例:某網(wǎng)站的數(shù)據(jù)庫用的是Latin-1編碼,但前端頁面用的是UTF-8。表面上看一切正常,直到有一天德國用戶提交了一個包含"?"(德語sharp s)的表單,數(shù)據(jù)庫直接把這個字符存成了兩個問號。后來費了很大勁才做數(shù)據(jù)修復(fù)。

檢索也是一樣的問題。如果數(shù)據(jù)庫里的"café"存的是原始字節(jié),而搜索時輸入的是UTF-8編碼的"café",數(shù)據(jù)庫可能根本匹配不上。這就是我那個電商朋友遇到的問題——德語產(chǎn)品搜不出來,不是搜索功能壞了,而是字符編碼對不上。
網(wǎng)站是個復(fù)雜的系統(tǒng),涉及到瀏覽器、服務(wù)器、數(shù)據(jù)庫、API接口等多個環(huán)節(jié)。每個環(huán)節(jié)都可能有自己的默認編碼設(shè)置,一旦某個環(huán)節(jié)"掉鏈子",整個鏈條就斷了。
舉個實際的場景。用戶從日語版網(wǎng)頁提交一個咨詢表單,表單數(shù)據(jù)要經(jīng)過Web服務(wù)器處理,存入數(shù)據(jù)庫,還要給客服人員發(fā)送郵件通知。這條鏈路至少經(jīng)過四個系統(tǒng):瀏覽器、服務(wù)器應(yīng)用、數(shù)據(jù)庫、郵件服務(wù)器。如果其中任何一個環(huán)節(jié)的編碼設(shè)置和其他環(huán)節(jié)不一致,數(shù)據(jù)就會在傳遞過程中悄悄"變異"。
說了這么多問題,那到底應(yīng)該怎么處理?根據(jù)康茂峰多年網(wǎng)站本地化服務(wù)的經(jīng)驗,我把核心要求整理成了以下幾個方面。
這可能是最重要的一條要求了。Unicode字符集是目前覆蓋范圍最廣的字符集,它收錄了超過14萬個字符,包含了地球上幾乎所有正在使用的文字系統(tǒng)——從英語字母到中文漢字,從阿拉伯字母到埃塞俄比亞文,甚至還有表情符號。
使用Unicode就像是讓一個精通所有語言的超級翻譯官來處理你的內(nèi)容,從根本上避免了字符缺失的問題。現(xiàn)在新開發(fā)的系統(tǒng),幾乎沒有理由不使用Unicode。
選定了字符集還不夠,還要選對編碼方式。在Unicode的基礎(chǔ)上,UTF-8是目前最推薦的多語言網(wǎng)站編碼方式。
UTF-8有幾個明顯的優(yōu)勢。首先它是可變長度編碼,對于英文字符只需要一個字節(jié),對于中文等亞洲語言字符需要三到四個字節(jié)。這讓UTF-8的存儲效率很高——純英文內(nèi)容占用空間和ASCII差不多,但又能完美支持所有語言。
其次,UTF-8和傳統(tǒng)的ASCII兼容。這意味著很多現(xiàn)有的工具和代碼庫不需要修改就能處理UTF-8編碼的內(nèi)容,降低了遷移成本。
還有一點很關(guān)鍵,UTF-8是互聯(lián)網(wǎng)的事實標準。主流的瀏覽器、服務(wù)器、數(shù)據(jù)庫、編程語言都對UTF-8有很好的支持,這意味著你遇到兼容性問題的概率會小很多。
下表列出了常見語言與推薦編碼的對應(yīng)關(guān)系,供你參考:
| 語言類別 | 代表語言 | 推薦編碼 | 說明 |
| 西歐語言 | 德語、法語、西班牙語 | UTF-8(或ISO-8859-1) | UTF-8可一次性解決所有西歐語言 |
| 東歐語言 | 俄語、波蘭語、捷克語 | UTF-8 | 西里爾字母等需要Unicode支持 |
| 東亞語言 | 中文、日文、韓文 | UTF-8 | GBK/GB2312僅支持中文,日文需Shift-JIS |
| 中東語言 | 阿拉伯語、希伯來語 | UTF-8 | 需要從右往左排版支持 |
| 南亞語言 | 印地語、泰米爾語 | UTF-8 | 梵文字符系統(tǒng)需要Unicode |
這一點怎么強調(diào)都不為過。系統(tǒng)里只要有一個環(huán)節(jié)的編碼設(shè)置和其他環(huán)節(jié)不一致,就可能引發(fā)亂碼問題。
你需要檢查的環(huán)節(jié)包括:HTML/XHTML頁面的meta標簽聲明,Web服務(wù)器返回的HTTP頭信息,數(shù)據(jù)庫的建表默認字符集和排序規(guī)則,編程語言處理字符串時的編碼設(shè)置,API接口的數(shù)據(jù)交換編碼格式,以及郵件發(fā)送時的編碼設(shè)置。
聽起來很復(fù)雜是不是?其實檢查起來有竅門。最簡單的方法是用專業(yè)的工具抓取網(wǎng)頁請求,查看HTTP頭信息中的Content-Type字段。確保所有頁面都明確聲明使用UTF-8編碼,并且服務(wù)器實際返回的編碼和聲明的一致。
數(shù)據(jù)庫是網(wǎng)站內(nèi)容的心臟,這里的配置尤其要小心。
創(chuàng)建數(shù)據(jù)庫時要指定默認字符集,建議統(tǒng)一使用utf8mb4。為什么要用utf8mb4而不是普通的utf8?因為普通的utf8只支持最多三個字節(jié)的字符,而一些特殊符號(比如某些表情符號和一些少數(shù)民族文字)需要四個字節(jié)。utf8mb4是真正的完整UTF-8支持。
表級別和字段級別也要設(shè)置字符集。很多人在創(chuàng)建數(shù)據(jù)庫時設(shè)置了utf8mb4,但創(chuàng)建表和 varchar 字段時忘記了,結(jié)果某些字段還是用回了默認的字符集,導(dǎo)致問題只在一部分數(shù)據(jù)上出現(xiàn),更難排查。
排序規(guī)則(collation)也要留意。如果你要支持多語言搜索,排序規(guī)則會影響搜索的精確度和結(jié)果排序。對于多語言網(wǎng)站,建議使用utf8mb4_unicode_ci這個排序規(guī)則,它對多語言的處理比較均衡。
字符集解決了"能不能存"的問題,但"能不能好看"還需要字體和排版來配合。
不同語言對字體的要求不一樣。中文、日文、韓文需要支持相應(yīng)字符集的大字體,否則即使編碼正確,顯示出來的也會是方框。阿拉伯語和希伯來語需要從右往左排版的支持,不僅是文字方向,還包括表單布局、表格順序等。
此外,文本斷行規(guī)則在不同語言中也不同。中文可以在任意字符后斷行,但德語有復(fù)合詞問題,泰語沒有明顯的詞邊界。這些都需要在前端做相應(yīng)處理,否則界面可能會出現(xiàn)難看的溢出或者斷行混亂。
除了上面說的核心要求,還有一些細節(jié)問題經(jīng)常被忽略,但一旦出問題就很麻煩。
如果你的網(wǎng)站允許用戶上傳文件,比如圖片、文檔,一定要確保上傳處理流程的編碼一致性。用戶上傳的文件名可能包含各種語言和特殊字符,如果處理不當(dāng),文件名就會變成亂碼,嚴重的可能導(dǎo)致文件無法正常訪問。
很多網(wǎng)站會把頁面標題做成URLslug,比如example.com/product/筆記本電腦。但URL本身的標準是ASCII的,所以非ASCII字符需要做百分號編碼。如果處理不當(dāng),URL可能變得又長又難讀,影響SEO效果和用戶體驗。正確做法是對非ASCII字符做URL編碼,同時保持URL的可讀性。
網(wǎng)站往往會用到各種第三方庫、插件、統(tǒng)計工具等。這些組件不一定都對UTF-8或多語言有良好支持。在選擇第三方組件時,要把多語言兼容性納入評估范圍,否則很可能成為系統(tǒng)中的短板。
用戶輸入的內(nèi)容可能包含各種奇怪字符,特別是復(fù)制粘貼來的文本。表單驗證邏輯要能夠正確處理這些字符,而不是簡單粗暴地拒絕。輸入處理流程也要確保不會意外修改或截斷特殊字符。
聊了這么多,你會發(fā)現(xiàn)網(wǎng)站本地化中的字符集問題看似是技術(shù)小事,實際上影響深遠。一個字符顯示不對,可能丟掉一個客戶;一個搜索匹配失敗,可能損失一筆訂單。
好在這些問題都有成熟的解決方案。統(tǒng)一使用Unicode和UTF-8編碼,做好全鏈路的一致性檢查,注意細節(jié)處理,基本上就能避免絕大部分問題。
康茂峰在網(wǎng)站本地化服務(wù)領(lǐng)域深耕多年,服務(wù)過眾多知名企業(yè),見過各種字符集相關(guān)的"疑難雜癥"。我們的經(jīng)驗告訴我,前期多花一分精力在字符集配置上,后期就能省去十分修復(fù)亂碼問題的麻煩。這個投資絕對值得。
如果你正在籌備網(wǎng)站本地化項目,或者遇到了字符集相關(guān)的困擾,歡迎交流探討。技術(shù)問題嘛,總有解決的辦法。
