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]; }
您还需要禁用编码检测......至少在我的情况下,我必须这样做。