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 正在逐渐让计算机语言变成一种全球的方言。 |