首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 m17n 实现各国语言间代码移植(3)

使用 m17n 实现各国语言间代码移植(3)

m17n 简介从内部来说,m17n 库会被组织成几个应用程序接口(API):
  • Core:这个 API 提供了处理 M-texts 的功能。Core API 并不需要 m17n 数据库。
  • Shell:Shell API 增加了 m17n 的数据库查找和搜索功能。Shell 包括了这个 API 的所有功能和特性。
  • GUI:GUI API 提供了在图形显示设备上输入并显示文本的功能。GUI 隐式地包含了 Shell 和 Core API 的所有特性。
  • Miscellaneous:这个 API 定义了几个函数来帮助对 m17n 库进行调试和跟踪。
m17n 库的使用与其他 Linux 或 UNIX 的库的使用相同。如果要使用这个库的所有特性,就需要在程序中包含 m17n.h 头文件,然后在链接选项中加上 -lm17n 选项,这可以在 Makefile 中实现。 如果只想使用 m17n 的一部分功能,Core、Shell、GUI 以及                        Miscellaneous API 每个都有单独的包含文件。不幸的是,m17n 并没有很多样例代码,很多明显引用它们的程序,例如可以识别 m17n 的应用程序,也只有两年的时间。然而,m17n 的软件开发包(SDK)确实包含了一个简单的程序,它可以使用各种编码来显示文件。我们可以查看一下所下载的 m17n 工具包中的 example 目录。在这个目录中,打开  mview.c 文件。这个文件的一部分如清单 2 所示。
清单 2. m17n 示例文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
...
325  M17N_INIT ();
326  if (merror_code != MERROR_NONE)
327    FATAL_ERROR ("%s\n", "Fail to initialize the m17n library.");
328  
329  /* Decide how to decode the input stream.  */
330  if (coding_name)
331    {
332      coding = mconv_resolve_coding (msymbol (coding_name));
333      if (coding == Mnil)
334        FATAL_ERROR ("Invalid coding: %s\n", coding_name);
335    }
336  else
337    coding = Mcoding_utf_8;
338  
339  mt = mconv_decode_stream (coding, fp);
340  fclose (fp);
341  if (! mt)
342    FATAL_ERROR ("%s\n", "Fail to decode the input file or stream!");
343  
344  {
345    MPlist *param = mplist ();
346    MFace *face = mface ();
347  
348    if (fontsize)
349      mface_put_prop (face, Msize, (void *) fontsize);
350    mplist_put (param, Mwidget, shell);
351    mplist_put (param, Mface, face);
352    frame = mframe (param);
353    m17n_object_unref (param);
354    m17n_object_unref (face);
355  }
356  
357  /* Create this widget hierarchy.
358     Shell - form -+- quit
359                   |
360                   +- viewport - text  */
361  
362  form = XtCreateManagedWidget ("form", formWidgetClass, shell, NULL, 0);
363  XtSetArg (arg[0], XtNleft, XawChainLeft);
364  XtSetArg (arg[1], XtNright, XawChainLeft);
365  XtSetArg (arg[2], XtNtop, XawChainTop);
366  XtSetArg (arg[3], XtNbottom, XawChainTop);
367  XtSetArg (arg[4], XtNaccelerators, XtParseAcceleratorTable (quit_action));
368  quit = XtCreateManagedWidget ("quit", commandWidgetClass, form, arg, 5);
369  XtAddCallback (quit, XtNcallback, QuitProc, NULL);
370  
371  viewport_width = (int) mframe_get_prop (frame, Mfont_width) * 80;
372  viewport_height
373    = ((int) mframe_get_prop (frame, Mfont_ascent)
374       + (int) mframe_get_prop (frame, Mfont_descent)) * 24;
375  XtSetArg (arg[0], XtNallowVert, True);
376  XtSetArg (arg[1], XtNforceBars, False);
377  XtSetArg (arg[2], XtNfromVert, quit);
378  XtSetArg (arg[3], XtNtop, XawChainTop);
379  XtSetArg (arg[4], XtNbottom, XawChainBottom);
380  XtSetArg (arg[5], XtNright, XawChainRight);
381  XtSetArg (arg[6], XtNwidth, viewport_width);
382  XtSetArg (arg[7], XtNheight, viewport_height);
383  viewport = XtCreateManagedWidget ("viewport", viewportWidgetClass, form,
384                                    arg, 8);
385  
386  /* Before creating the text widget, we must calculate the height of
387     the M-text to draw.  */
388  control.two_dimensional = 1;
389  control.enable_bidi = 1;
390  control.disable_caching = 1;
391  control.max_line_width = viewport_width;
392  mdraw_text_extents (frame, mt, 0, mtext_len (mt), &control,
393                      NULL, NULL, &metric);
...




下面对这些代码详细介绍一下:
  • 第 325 行负责对 m17n 库进行初始化。
  • 第 330 行的 coding_name 变量源自于一个指定输入文件编码的命令行参数;如果没有提供这种命令行,就使用 UTF-8 编码。
  • 第 339 行读取到达的数据,并根据编码类型对其进行解码,现在都反应在 coding 中。
  • 第 345 到 354 行设置要画的文本框架。第 345 行从手头的 M-text 中提取出一些属性,而 346 行则提取出给定文本使用的适当字体。第 348 行设置要显示使用的字体大小(fontsize 是另外一个命令行参数),第 350 和 351 行设置该框架中要画的其他属性,包括要画到哪个小部件上(前面的 shell = XtOpenApplication (&context,                                        "M17NView", NULL, 0, &argc, argv, NULL, sessionShellWidgetClass, NULL, 0) 和最后的类型定义。
  • 第 362 到 383 行是典型的 X 工具包调用,用来设置应用程序的主窗口。第 371 到 372 行负责计算对于本地拼字法的一个 80 x 24 的窗口来说,视口应该多大。
  • 最后,在为 M-text 呈现设置一些参数之后,在 392 行就会开始显示 m17n 文本。
总而言之,上面对这段代码片段的简短分析就说明了在标准的 X 应用程序中通常要执行哪些操作。在很多情况中,创建一个多语言的应用程序只需要很少的额外代码就可以实现,这需要采用 m17n 的函数,而不是传统的 X 调用。
展望如果没有可以构建 m17n 代码的系统,也不要烦恼。您仍然可以通过在线 m17n 呈现演示来体验这个库的作用(参看  中的链接)。
据开发人员说,他们正在继续在 GTK+ 中集成 m17n —— 这是扩宽 m17n 的认可程度以及影响力的下一个必不可少的步骤。现在,m17n 项目缺少样例代码供参考和扩展。建立更好的文档也是另外一个需要做的工作,这与为主流平台提供二进制文件一样重要。然而,m17n 确实承诺会对各个省的方言也能够实现 WYSIEYG 的编辑。这对任何语言来说都是个好消息。
个人计算机已经不再是什么新奇的东西了。实际上,在不到 20 年的时间内,计算机已经成为了家庭的日常用品 —— 只不过它不是什么衣服之类的东西,而是用来管理信息的工具。然而,有些国家计算机的获得和使用还并不普遍。为了平衡这种不平等,需要让这些国家能够获得负担得起的各种计算机硬件和软件。另外,还要保证本土居民能够以本地方言来使用计算机。
m17n 库构建在 Unicode 和其他标准之上,用来根据手写语言的规则画出任意复杂的拼字法。它将代码与字符的格式区分开来,因此相同的代码可以反复使用,甚至是在相同的应用程序中呈现不同的拼字法都可以。随着这些工作的不断进展,m17n 正在逐渐让计算机语言变成一种全球的方言。
返回列表