跳转到内容

WebObjects/EOF/使用 EOF/本地化和国际化

来自维基教科书,开放世界中的开放书籍

使用 UTF-8 编码

[编辑 | 编辑源代码]

将以下代码放在您的 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,另一个是关于表单中的数据?我有点困惑。

David Paules

[编辑 | 编辑源代码]

对我来说,修改 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];
 }

您还需要禁用编码检测......至少在我的情况下,我必须这样做。

华夏公益教科书