現如今的EBS系統中,為了推進國際化的進程,以及系統向全球化的擴展,在Oracle數據庫的編碼方式上漸漸從支持中國本土簡體中文的ZHS16GBK轉向了更趨於國際化的AL32UTF8編碼方式。但隨之而來在中國就會產生很多問題,例如:
- 其他的外圍系統仍然使用簡體中文GB2312/ZHS16GBK編碼,在接口文件傳輸時由於編碼不一致而產生亂碼問題
- Excel不兼容,簡體中文版的Excel在讀取文本文件時采用的是默認的簡體中文編碼方式打開,所以已UTF-8編碼的文件(如CSV文件)在打開時會產生亂碼問題
所以在中國的IT系統,一旦選擇采用了AL32UTF8的國際化編碼方式之后,了解一些編碼方式的區別以及常見問題的解決方法是非常必要的。
編碼方式
這里就不深入討論編碼的知識了,簡單闡述一下二者的不同之處,見如下表格:
編碼方式 | 隸屬於 | 一個中文字符所占字節 | 說明 |
ZHS16GBK | ANSI | 2 | 與所有隸屬於ANSI的編碼兼容 |
AL32UTF8 | Unicode | 3 | 與所有隸屬於Unicode的編碼兼容 |
所以二者屬於兩套字符集衍生出來的,所以並不兼容,需要顯示的進行轉碼才能正常顯示。
PLSQL/SQL客戶端的配置
客戶端配置需要考慮Oracle Client的所支持的語言和注冊表中NLS_LANG鍵值的設置。
- Oracle客戶端需要安裝兼容64為的32位客戶端:win32_11gR2_client,具體請從Oracle官方網站上進行下載;
- NLS_LANG的鍵值需要設置成“AMERICAN_AMERICA.AL32UTF8” 或者 “SIMPLIFIED CHINESE_CHINA.AL32UTF8”
EBS基礎設置
請確保一下表格中列示的配置文件已經設置了正確的值:
配置文件名稱 | 設置層 | 配置文件值 |
FND: NATIVE CLIENT ENCODING | SITE | UTF8 |
ICX: Client IANA Encoding | SITE | Unicode (UTF-8) |
當為文本類型輸出格式設置新的打開方式時,請確保“Allow Native Client Encoding”已經勾選。
報表類程序(HTML, HTML as EXCEL, PDF)
對於HTML的報表,需要在HTML頭上指定encoding為utf-8:<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
另外編碼方式可以用一下代碼動態從系統中獲取:
l_encoding := fnd_profile.value('ICX_CLIENT_IANA_ENCODING');
對於PDF輸出類報表,以上獲取編碼方式的方法仍然適用,並填充值XML的頭部:
<?xml version="1.0" encoding="utf-8"?>
另外,如果報表輸出的中文全部顯示成問號“?”,那么這種情況並不是編碼方式導致的,而是服務器上缺失了必要的字體文件,在后台運行如下腳本復制字體文件到指定目錄下:
#!/bin/sh cp $FND_TOP/resource/ALBAN*.ttf $AF_JRE_TOP/lib/fonts
文件讀寫及外部接口兼容
1. 文件輸出
對於從Oracle生成並輸出的文本文件,默認的編碼方式肯定是UTF-8(無BOM)的。所以一旦目標系統的編碼方式是簡體中文的話,那么轉碼的步驟一定是必須的。我們可以從兩個階段入手進行轉碼。
第一個階段是在每一批寫入文件的數據在寫入文件之前強制利用CONVERT函數進行轉碼,如:
l_converted_str := CONVERT('你好', 'ZHS32GB18030');
第二個階段是就是在文件生成之后,利用相對高級的文本編輯器,如Notepad++,對文件進行轉碼UTF-8 -> ANSI
2. 文件讀取
與文件類似,只不過只能利用文本編輯器提前轉碼之后方能被Oracle處理。
Excel文件輸出和Export導出
utf-8格式的csv或分割符文件在excel打開會出現亂碼的情況:
utf-8格式的文本文件
利用文本編輯器進行轉碼后方能正確顯示:
ansi格式的文件
總結
1. 檢查配置文件和View Options是否設置正確
2. HTML格式報表記得要動態從系統中獲取encoding
3. PDF報表記得安裝字體
4. 輸出到外部的文件需要進行必要轉碼操作(convert函數或文本編輯器)