WebObjects/EOF/使用 EOF/本地化和國際化
將以下程式碼放在您的 WOApplication 的 dispatchRequest 中
worequest.setContentEncoding(_NSUtilities.UTF8StringEncoding);
worequest.setHeader("text/html; charset=UTF-8; encoding=UTF-8", "content-type");
這將使每個頁面在將內容傳送回瀏覽器時使用 UTF8 編碼。
要使用 UTF-8 編碼,您需要四個步驟
- 您必須確保您的資料庫使用 UTF-8 作為儲存格式。它是 FrontBase 的預設設定,但您需要對 Oracle 進行一些調整。如果我記得正確,您需要將這些新增到 EOModeler 中的連線字典中
NLS_DATE_FORMAT = "YYYY-MM-DD HH24:MI:SS";
NLS_LANG = AMERICAN_AMERICA.UTF8;
databaseEncoding = "UTF-8";
- 對於 PostgreSQL,要啟用 UTF-8 支援,您必須使用
--enable-multibyte
標誌進行編譯,因此您可以建立新的資料庫,並使用以下命令指定編碼:
createdb -U postgres -E UNICODE
- 將您的頁面編碼為 UTF-8。將其設定為 WO 構建器中的預設設定,並透過檢查 *.wo 資料夾中的 *.woo 檔案來檢查編碼。
{"WebObjects Release" = "WebObjects 5.0"; encoding = NSUTF8StringEncoding; }
如果它們尚未編碼為 UTF-8,您可以將上面的行復制貼上到您的 .woo 檔案中。然後,您可以透過轉到“格式”選單並選擇“檔案編碼”來更改 .wod 和 .html 檔案(在 pbx 中)的編碼。
執行此步驟的原因是在執行時最大限度地減少轉換。如果您的所有元件都已編碼為 UTF-8,則 WO 在頁面生成過程中不需要進行任何轉換。我從來沒有實際測試過效能,所以它可能是沒有必要的。
- 在您的標題中新增以下 META
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
- 您還需要覆蓋 Session.appendToResponse 並將編碼設定為“UTF8”;在呼叫 super 之前,同樣適用於 takeValuesFromRequest。您可能還想在標題中新增一個元資料,以提供編碼(我不確定這在現代瀏覽器中是否必要)。
public void appendToResponse(WOResponse aResponse, WOContext aContext) {
// set the encoding before anything is garbled
aResponse.setContentEncoding( _NSUtilities.UTF8StringEncoding );
super.appendToResponse(aResponse, aContext);
}
public void takeValuesFromRequest(WORequest aRequest, WOContext aContext) {
aRequest.setDefaultFormValueEncoding( _NSUtilities.UTF8StringEncoding );
super.takeValuesFromRequest(aRequest, aContext);
}
注意在 WOMessage 中設定編碼時的兩種拼寫,名稱是“UTF8”;或使用私有函式 _NSUtilities.UTF8StringEncoding。在其他所有地方都是“UTF-8”。
這真的有必要嗎?在應用程式建構函式中新增 WOMessage.setDefaultEncoding("UTF8") 不夠嗎?
順便說一句,我不太理解 WOMessage.defaultEncoding 和 WORequest.defaultFormValueEncoding 之間的區別
一個是關於 URL,另一個是關於表單中的資料?我有點困惑。
對我來說,修改 EOModel 的連線字典的第一步是不必要的。我使用 OpenBase 作為我的後端資料庫。OpenBase 允許您使用 n 種不同的編碼之一建立資料庫(UTF8 是其中之一)。EO 框架能夠在沒有對連線字典進行任何定製的情況下(即,連線字典只有 jdbc 驅動程式和資料庫 URL 以及使用者名稱/密碼)從 OpenBase 儲存和檢索 UTF8 字元資料。
由於您必須修改會話的 appendToResponse 方法,因此您可以透過在程式碼中一次性執行來簡化向所有頁面新增 META 標記的過程。只需新增
aResponse.setHeader("text/html; charset=UTF-8; encoding=UTF-8", "content-type");
在呼叫之前
super.appendToResponse(aResponse, aContext);
另一個人補充說:注意,這與向所有頁面新增元標記不同。它向所有響應添加了一個標題。但這應該是一樣的,甚至更好。META 標記實際上只是為了模擬標題。
對於使用 ObjectiveC 的 WebObjects 4.x,您需要在 WOComponent 類中使用以下程式碼
-(void) appendToResponse: (WOResponse *) r inContext: (WOContext *) c
{
[r setHeader:@"text/html; charsetUTF-8; encoding=UTF8"; forKey:@"Content-type"];
[r setContentEncoding:NSUTF8StringEncoding];
[super appendToResponse:r inContext:c];
}
-(void) takeValuesFromRequest: (WORequest *) r inContext: (WOContext *) c
{
[r setFormValueEncodingDetectionEnabled:NO];
[r setDefaultFormValueEncoding:NSUTF8StringEncoding];
[super takeValuesFromRequest:r inContext:c];
}
您還需要停用編碼檢測......至少在我的情況下,我必須這樣做。