第十八章:开发国际化应用程序

要想进入国际市场,必须有效设计 Visual FoxPro 应用程序,使程序像在国内使用一样适应国际需要。本章将介绍如何使用 Visual FoxPro 的国际化特征,来编制适用于指定地区的应用程序。

本章内容要点:

规划一个国际化应用程序

准备一个国际化应用程序一般包括以下三步:创建数据、编写代码和设计用户界面。要完成这些步骤,需注意如下问题。

下面几节解答了这些问题,并介绍了其他一些注意事项。

提示 在开始开发应用程序的时候就应考虑国际化的问题,这要比在应用程序开发完后再进行国际化更加节省开支,且开发周期缩短。

准备国际化数据

为了给一个应用程序创建国际化数据,可以手工输入、从其它应用程序中导入或向已有的文件和备注字段中追加数据。有关导入和追加数据的详细内容,请参阅《用户指南》中的第九章“导入和导出数据”

接受什么样的数据?

要决定哪些类型的数据是可接受的,首先要考虑使用应用程序的地区。地区不但决定了数据使用的语言,而且也决定了其文化内涵。

此外,语言将影响用于准备数据的代码页。代码页是一个字符集,计算机用这个字符集来准确地显示数据,控制国际化字符。国际化字符包括具有注音符号的字符。注音符号放置在字母的上方、下方或覆盖其上,表示该字母与未加标记的字母发音不同。最常用的注音符号有:抑音符(à 中的 `)、尖音符(á 中的 ´)、母音符(â 中的 ^)、鄂音符(ã 中的 ~)、母音变化符(ä 中的 ¨)、圆音符(å 中的 °)和(ø 中的 /),均用于元音的发音。

通常,在处理数据时,会根据适当的代码页自动标识数据。但是,如果用人工方式给一个表指定代码页或是由于其它原因引起代码页改变,用户可能就无法识别所显示的全部或部分数据。有关代码页的详细内容,请参阅本章稍后的“处理代码页”

有些语言,象中文、朝鲜语和日语,使用 DBCS(双字节字符集)表示它们的数据。如果应用程序要在这种环境下运行,就需要使用特定的字符串处理函数和排序序列,才能使应用程序正常执行。有关在 DBCS 环境下工作的详细内容,请参看本章稍后的“处理双字节字符集”

如何编写代码?

一个应用程序由用户界面组件和应用程序组件构成。用户界面组件包括图形、字符串,以及对应于不同地区的设置信息,如日期、货币、数值和分隔符。应用程序组件包括运行于所有地区的代码,其中也包括用于处理用户界面中的字符串和图形的代码。

构成应用程序的组件

在设计应用程序时,应使应用程序组件和用户界面组件分离,因为这样可以使得应用程序更易于本地化和维护。例如,各组件分离后,在本地化界面单元时就不需要再浏览源代码。有关编写代码的详细内容,请参阅本章稍后的“创建及修改程序”

如何设计用户界面?

用户界面中的菜单、表单、控件、工具栏和位图要根据应用程序所针对的地区特点来设计。例如,当设计用于德国和法国的应用程序时,所用的对话框必须足够大,以便显示已翻译成德语和法语的提示信息。另外,图标和位图上的图形要根据不同地区的文化特征进行修改,以便在应用程序使用地区的用户能够正确理解。有关设计用户界面的详细内容,请参阅本章稍后的“设计界面”

测试应用程序

若要测试国际化应用程序,需要测试应用程序设计的对于国家/地区和语言的依赖程度。测试包括检查应用程序的数据和用户界面,确保符合使用国家/地区有关日期、时间、数值、货币、列表分隔符和度量单位的规定。

设计界面

由于在本地化应用程序时文本有增加的趋势,所以在设计如下用户界面组件时要细心:

创建应用程序信息

当在应用程序中创建信息时,英语的文本字符串通常比相应其他语言的文本字符串短。下表显示出了字符串长度的平均增加值。

英语长度(字符数) 本地化字符串的增长量
1 到 4 100%
5 到 10 80%
11 到 20 60%
21 到 30 40%
31 到 50 20%
超过 50 10%

设计菜单和表单

与信息一样,在本地化应用程序时菜单和表单会增大。例如,考虑如下表单,它是自动提款机示例应用程序的一部分。第一张图为英语表单,第二张图为对应的西班牙语版本,可以看到增长的字符串需要更多的空间。

提示 如果在界面中为增长的字符串而预留空间,做本地化工作的程序员就会花较少时间来改变控件的大小并重新设计界面。

在本地化时,文本需要更多的空间。

在菜单和表单中,要避免状态栏过于拥挤,同时要避免使用缩写(因为在其他语言中可能不存在对应的缩写)。

使用图标和位图

如果使用适当,图标和位图会成为用户界面的重要组成部分。然而,图标和位图的含义会比单词的含义更模糊,因此在使用图标和位图时应考虑如下规则:

如果对所使用的图标和位图是否合适没有把握,可与当地的人员进行讨论。

输入国际化数据

开发应用程序的一个重要方面是要知道如何向应用程序输入数据。可以用以下两种方法输入数据:

下面各节讨论了上述两种方法。

输入国际化字符

可以使用键盘在 Visual FoxPro 中输入国际化字符。具体的方法取决于所使用的语言环境。在单字节字符环境下,可以直接键入字符,也可以在键盘上按下键的组合输入字符。另一方面,DBCS 环境经常提供输入法生成器 (IME),可以使用这个应用程序输入字符。

使用键盘输入字符

使用国际键盘,简单地按下用于国际字符的键就可以显示它们。如果键盘上没有用于国际字符的键,使用 Windows 提供的字符映射表,或在按下 ALT 键的同时使用数字键盘内的键,也可以输入这些字符。

输入国际化字符的最简单方法是从字符映射表上复制。在 Windows 95 中,字符映射表可以从“附件”菜单中找到。

还可以使用另一种方法来输入这些字符。即在按下 ALT 键的同时,使用数字键盘输入由零开始的四位数内码。

注释 不能用 FoxFont 字体键入国际化字符。例如,如果打开“命令”窗口,切换到 FoxFont,然后按下相应的键,屏幕上显示的字符并不是键盘上的字符。为避免这种情况发生,在国际化应用程序中不要使用 FoxFont。

若要创建国际化字符

例如,若要输入(ASCII 码 246),先按下数字键盘上的 NUM LOCK,然后输入 ALT+0246。注意要使用标准 Windows 字体 — 不是 FoxFont 或 FoxPrint。

疑难解答 如果字符不能正确转换,请查看使用的是否为 FoxFont 字体。例如,FoxFont 字体是 DEFINE WINDOW 命令(如果省略了 FONT 子句)创建用户自定义窗口时的默认字体。用户创建自定义窗口时,要使用 FONT 子句来指定一种非标准的 Windows 字体,这样国际化字符才能正确显示。

使用 IME 输入字符

如果在 IME 环境下工作,可以使用“输入法生成器”在 Visual FoxPro 中输入字符。IME 是一个同您的工作环境一起提供的应用程序,它允许您用键盘输入字符时,显示一连串国际化字符,可以从中选择所需的特定字符。例如,一个中文 IME 可以输入拼音来指定一个汉字,然后显示一个与该拼音匹配的字符列表。选择了所需的字符后,IME 将它粘贴到 Visual FoxPro 中。

可以控制何时在 Visual FoxPro 中显示 IME,这项工作是通过创建 IMEMode 属性或调用 IMESTATUS( ) 函数来完成的。如果打开 IME 窗口,在一个象“浏览”窗口或“编辑”窗口这样的系统窗口中进行编辑操作时,Visual FoxPro 自动显示 IME。如果关闭 IME 窗口,可以通过按下键盘上适当的键来激活 IME。

追加和复制国际化数据

如果使用 APPEND FROMCOPY TO 命令从带分隔符的文件中导入或复制数据,可以在文件中指定用来分隔字段的字符。例如,在欧州许多国家/地区一般使用分号 (;) 作为字段分隔符,而在美国一般使用逗号 (,)、制表符或空格作为分隔符。

若要导入或复制文件,并且需要指定一个分隔符,可向 APPEND FROM 或 COPY TO 命令中添加 DELIMITED WITH CHARACTER 子句:

COPY TO mytxt.txt DELIMITED WITH _ WITH CHARACTER ";"

处理代码页

存储在 Visual FoxPro 中的数据经常用一个代码页标识,代码页是一个字符表,以及 Windows 用于正确显示数据的内存相应编号。例如,如果在一个 .dbf 文件中键入字母 C,这个字母就存储在硬盘上,编号为 67 。打开文档时,Visual FoxPro 就确定了它的代码页,检查代码页并查找与 67 相对应的字符,然后在显示器中显示字符 C。

代码页大致对应于不同的字母表。例如,Windows 为英文、德文、北欧文等提供代码页。通过使用不同的代码页,应用程序可以恰当地显示这些来自不同字母表中的字符。

深入理解 Visual FoxPro 中的代码页

Visual FoxPro 使用一个代码页显示数据。默认情况下,这是 Windows 使用的当前代码页。但是,通过在配置文件中指定另一个代码页(必须是有效的代码页),可以忽略 Windows 代码页。

Visual FoxPro 中的表由在创建表时使用的代码页来标识。使用表时,Visual FoxPro 就检查表的代码页是否与当前代码页相匹配。如果它们相匹配,Visual FoxPro 将显示表中的数据。如果没有表的代码页(例如,表是在较早的 FoxPro 版本下创建的),Visual FoxPro 将提醒您使用一个代码页,并用这个代码页来标识文件。

如果表的代码页与系统代码页不匹配,Visual FoxPro 就会尝试将表中的代码页转换为当前使用的代码页。例如,您正在使用 Visual FoxPro,并且当前系统代码页是英文代码页,字符 ü 便由 ANSI 值 252 来代表。如果在您的代码页表中 ü 字符是由 ANSI 值中的 219 来代替的,那么,Visual FoxPro 会将所有的 ANSI 值 219 转换为 ANSI 值 252,这样就会正确显示字符 ü

代码页并不是在所有的情况下都能很好地转换,这是因为在一个代码页中所包含的字符在其它代码页中并不是一一对应的。例如,由于 Windows 代码页不包含线条化的字符,便不能在 Windows 下映射包含 MS-DOS® 线条化字符的数据。同样,由于两种语言之间没有一一对应的字符表,不能将在俄文代码页下创建的数据转换为英文代码页下的数据。最后,Visual FoxPro 不包含对特别的代码页进行字符转换映射的功能。在这种情况下,屏幕上显示的是未经代码页转换的数据。(在不进行代码页转换时,Visual FoxPro 不显示错误信息。)上述任何一种情况都可能显示不正确的字符。

如果要为一个地区创建一个应用程序,在应用程序中除包含为那个地区和环境设计使用的代码页外,也不能回避代码页转换问题。例如,要为俄国创建一个应用程序,可以在 Windows、MS-DOS,或 Macintosh 环境下分别使用 1251、866 或 10007 代码页。有关完整的列表,请参阅本章稍后“Visual FoxPro 支持的代码页”

如果要输入某些字符,而键盘上没有键代表这些字符,则可以使用 ALT 加上数字小键盘上的键来输入这些字符。但是,请记住在不同代码页环境下的键经常会显示不同的结果。例如,如果在 Visual FoxPro 中的 1252 代码页下键入 ALT+0182 ,会看到一个段落标记。相反,如果在 MS-DOS 的 Visual FoxPro 中的代码页 473下 键入 ALT+0182,将会看到一个带有两条坚直线,一条水平线的图形字符。.

虽然 Visual FoxPro 支持许多代码页,但是只有少数几个代码页经常使用。例如,对于 Visual FoxPro for Windows,英语用户一般使用代码页 1252,对于 Visual FoxPro for Macintosh,英语用户一般使用代码页 10000。而对于 FoxPro for MS-DOS,英语用户一般使用代码页 437。

在使用为一个特别地区设计的代码页时,要保证用户界面和数据正确显示。如果在屏幕上看到预料之外的字符,可检查该字符的代码页。

指定 .dbf 文件的代码页

当创建 .dbf 文件时,Visual FoxPro 自动记录代码页标记,使用户知道他所用的代码页。但是,如果使用的是由以前版本的 FoxPro 保存的 .dbf 文件,其中可能没有代码页标记。

在打开文件后,可以使用 CPDBF( ) 函数来确定 .dbf 文件是否具有代码页标记,或在文件打开时由 Visual FoxPro 自动检测。

若要自动检测代码页标记

  1. 在“工具”菜单中选择“选项”命令。

  2. 选择“数据”选项卡。

  3. 选中“提示代码页”复选框。

    要在以后的 Visual FoxPro 工作期中使用此设置,可选择“设置为默认值”。

    提示 如果不选择“提示代码页”复选框,可使用 SET CPDIALOG 命令检测代码页标记。

如果一个文件没有代码页标记,必须按下节所述加入一个标记。

添加代码页标记

如果使用的是以前版本的 FoxPro 的 .dbf 文件,则其中可能没有代码页标记。没有此标记,文件显示可能不正确。如果选择了自动代码页检查,那么在打开文件时就可知道它是否有代码页标记。如果没有,可以添加一个。

若要人工给 .dbf 文件添加代码页标记

  1. 确认自动检查代码页有效(参见上述过程)。

  2. 打开文件。

    如果文件没有代码页标记,“代码页”对话框出现。

    “代码页”对话框

  3. 选择合适的代码页标记。

  4. 查看文件,判断所指定的代码页是否正确。

    如果有部分数据不能看到或不能识别,说明代码页不正确。

  5. 如果代码页不正确,使用 Visual FoxPro 的 Tools\Cpzero 目录中的 CPZERO 程序移去代码页标记。有关的详细内容,请参阅本章稍后的“移去代码页标记”

  6. 重复上述过程直到代码页正确为止。

    注释 象程序 (.prg) 和查询 (.qpr) 这类文件不包含代码页标记,这意味着所使用的代码页未知。但是,如果在项目中包括这类文件,项目可保存所使用的代码页记录。有关的详细内容,请参阅本章稍后的“指定文本文件的代码页”

移去代码页标记

如果一个 .dbf 文件显示不正确,那么它的代码页标记可能是错误的,可使用 Visual FoxPro Tools\Cpzero 目录中的 CPZERO 程序移去代码页标记。运行 CPZERO,代码页设置为 0,意味着没有代码页。

若移去代码页标记

更改代码页标记

删除代码页标记,然后添加一个新的;或把文件复制到另一个文件;或使用CPZERO 程序都可以改变一个 .dbf 文件的代码页标记。

若要通过复制文件来更换一个 .dbf 文件的代码页

当 COPY TO 命令完成时,目标文件中的数据将具有新的代码页。

若要使用 CPZERO 改变代码页标记

指定文本文件的代码页

如果忘记指定一不在项目中的文本文件的代码页,就不能确定其代码页,因为文本文件没有象 .dbf 文件所具有的代码页标记。要记录文本文件代码页的最好办法是将其加到项目中。

若要为文本文件指定代码页

  1. 打开“项目管理器”

  2. 选定想要指定代码页的文本文件。

  3. 从“项目”菜单中选择“项目信息”。

  4. “项目信息”窗口中单击“文件”选项卡。

  5. 使用鼠标右键,单击选定的文件。

  6. 从子菜单中选择“代码页”。

    Visual FoxPro 将显示“代码页”对话框。

  7. 选择合适的代码页。

    Visual FoxPro 显示可用代码页

如果知道一个文本文件的代码页,可以使用适当的 Visual FoxPro 命令的 AS 子句来指定它。对于要导入或追加的文件,在 IMPORTAPPEND 命令中指定代码页。对于查询、源程序和其他已在计算机中的文本文件,使用 MODIFY QUERYMODIFY COMMANDMODIFY FILE 命令来改变代码页。

如果对使用的代码页没有把握,在命令中用 GETCP( ) 函数取代代码页号。GETCP( ) 函数显示“代码页”对话框,可以选择合适的代码页。

注释 有些字符不能在代码页之间成功地进行转换。此外,Visual FoxPro 不支持某些代码页转换。要经常检查代码页转换的结果,以保证成功地转换了数据。

确定项目文件的代码页

在向一个项目添加了一个文件后,可以确定它的代码页。所用的方法取决于该文件是一个表(DBF 文件)还是一个文本文件。

若要确定文本文件的代码页

  1. 打开“项目管理器”

  2. 在“其他”项下,选择想要知道其代码页的文本文件。

  3. 从“项目”菜单中选择“项目信息”。

若要确定表的代码页

当从一个项目中编译应用程序时,无论这些文件有多少种代码页,项目管理器都会自动地将文件集成到项目中去。编译所得的应用程序将拥有当前的代码页。

注释 当把一个 .dbf 文件加到项目中时,不需指定此文件的代码页,因为 Visual FoxPro 会自动从文件的代码页标记中得到它的代码页。然而,当把一个文本文件加入项目时,必须指定此文件的代码页,因为 Visual FoxPro 不能自动确定其代码页。

要使一个程序能用于另一个代码页,在新的平台上保存或编译时,需要指定它原有的代码页。例如,要把在 FoxPro for MS-DOS 中开发的程序用于 Visual FoxPro,必须在 Visual FoxPro 保存或编译程序时,指定合适的 MS-DOS 代码页。如果使用 COMPILE 命令,可用 AS 子句来指定代码页。此外,也可以在编译程序之前使用 SET CPCOMPILE 命令来设定代码页。

指定变量的代码页

您也许想用某些特定的方法处理国际化数据。例如,想将变量中的数据转换为其它代码页,或者您希望能防止字符或备注字段中数据转换为其他代码页。

转换变量中的数据

如果在应用程序代码中,一个变量包含着其他代码页的数据,可以使用 CPCONVERT( ) 函数将该数据的代码页转换为合适的代码页。例如,假设变量 x 中包含着由 Macintosh 代码页 (10000) 创建的数据,要将其转换到 Windows 代码页 (1252),可使用如下命令:

cConvert=CPCONVERT(10000,1252,x)

在 Windows 中,转化后的数据与在 Macintosh 上看到的一样。例如,在 Macintosh 中形如“?”的字符在 Windows 是完全一样的。

禁止对字符型或备注型字段中的数据进行转换

在某些情况下不需要自动转换代码页。例如,对于一个包含加密密码的字符型字段,就不希望 Visual FoxPro 自动转换密码,因为一旦转换,它就不再是原来的密码了。

若要禁止某一字符型或备注型字段中的数据被转换

  1. 打开包含此表的项目。

  2. 选择此表。

  3. 选择“修改”按钮。

    出现 “表设计器”

  4. 选择要保护的字段。

  5. 从“类型”列表中,对字符型字段选择“字符型(二进制)”,对备注型字段选择“备注型(二进制)”。

  6. 选择“确定”,然后选择“是”使此修改结果成为永久性结果。

  7. 使用 DISPLAY STRUCTURE 命令显示表的结构来验证所作的修改。

    另外,可使用 MODIFY STRUCTURE 命令保护适当的字段。

也可以使用 CHR( ) 函数来禁止一个文本文件中选定的字符被转换。

Visual FoxPro 支持的代码页

代码页是指定某种语言和硬件平台的字符集。重音字符在不同的平台和代码页中表示为不同的值。另外,在一个代码页中可以使用的字符在其他代码页中不一定能使用。

代码页 操作平台 代码页标识符
437 U.S. MS-DOS x01
620 * Mazovia (Polish) MS-DOS x69
737 * Greek MS-DOS (437G) x6A
850 International MS-DOS x02
852 Eastern European MS-DOS x64
861 Icelandic MS-DOS x67
865 Nordic MS-DOS x66
866 Russian MS-DOS x65
895 * Kamenicky (Czech) MS-DOS x68
857 Turkish MS-DOS x6B
1250 Eastern European Windows xC8
1251 Russian Windows xC9
1252 Windows ANSI x03
1253 Greek Windows xCB
1254 Turkish Windows xCA
10000 Standard Macintosh x04
10006 Greek Macintosh x98
10007 * Russian Macintosh x96
10029 Macintosh EE x97

* 当配置文件中包含有 CODEPAGE=AUTO 语句时,不检测代码页。

在国际化应用程序中排序数据

在创建国际化数据表后,需要检查应用程序是否排序正确。对数据如何排序取决于表所用的代码页,因为代码页指定了可用的排序次序或排序序列。

深入了解排序次序

排序次序包容了不同地区的排序规则,允许各种语言的数据正确地排序。在 Visual FoxPro 中,当前的排序次序决定了字符表达式比较的结果和在索引或排序表中记录的位置。

注释 在双字节字符 (DBCS) 环境中,排序的方式不同。有关详细内容,请参阅本章稍后的“排序 DBCS 数据”

因为不同的排序次序会产生不同的排序结果,因此应按下表选择合适的排序次序。

Unsorted Machine General Spanish
!@#$ space space space
1234 !@#$ !@#$ !@#$
space 1234 1234 1234
Caesar Caesar äa äa
cæsar Car ab ab
Strasse Char äb äb
straße Czech Caesar Caesar
Car Strasse cæsar cæsar
Char Ab Car Car
Czech cæsar Çar Çar
ab straße Char Czech
Çar Çar Czech Char
äa Äa Strasse Strasse
äa Äa straße straße

排序次序准则

在选择排序次序时要考虑如下问题:

下面几节说明如何指定排序次序,检测当前排序次序及认识排序次序的影响。

指定排序次序

可以在如下的索引和排序操作中为字符型字段指定排序次序。

若要指定排序次序

  1. 在“工具”菜单中选择“选项”。

  2. 选择“数据”选项卡。

  3. 在“排序序列”框中,选择适当的排序次序。

    要将此设置用于以后的 Visual FoxPro 操作,选择“设置为默认值”。

    提示 也可以使用 SET COLLATE TO 命令或在 Config.fpw 文件中的 COLLATE 语句里指定排序次序。有关 Config.fpw 的详细内容,请参阅《安装指南》中的的第三章“配置 Visual FoxPro”

当前的排序次序并不影响以前创建的索引。然而,它对比较结果和 SEEK、SELECT - SQL 等命令确有影响。有关详细内容,请参阅本章稍后的“认识排序次序的影响”

可以在任何时刻更改排序次序。例如,在打开一个 customer 表后,可以创建索引标识来代表不同的排序次序,如下列代码所示。然后,只需使用不同的索引标识就可改变排序次序。

USE customer
SET COLLATE TO "GENERAL"
INDEX ON fname TAG mygeneral ADDITIVE
SET COLLATE TO "MACHINE"
INDEX ON custid TAG mymachine ADDITIVE
SET COLLATE TO "DUTCH"
INDEX ON lname TAG mydutch ADDITIVE

注释 索引的排序次序会覆盖当前的排序次序。

当前的代码页决定了哪种排序次序可供使用。当前的代码页不支持用 SET COLLATE 命令指定的排序次序,Visual FoxPro 会报告出错。另外,如果当前的代码页不支持在 Config.fpw 中指定的排序次序,那么将使用默认值“Machine”。

检查排序次序

可使用 SET ('COLLATE') 函数来确定当前的排序次序。例如,可保存当前的排序次序,将当前的排序次序设置为“Machine”,执行所需的任何工作,然后使用如下代码恢复原有的排序次序:

cCurrentOrder=SET('COLLATE')
SET COLLATE TO 'MACHINE'
*
* 需要 Machine 排序次序的代码
*
SET COLLATE TO cCurrentOrder  && 返回到前一个排序次序

此外,可使用 IDXCOLLATE( ) 函数来决定索引和索引标识的排序次序。

认识排序次序的影响

排序次序对字符串比较、SEEKSELECT - SQL 等命令的结果有影响,如下所述。

字符串比较

除“Machine”和“Unique Weight”排序次序外,其余排序次序都忽略大小写,这意味着在索引表达式中不一定要使用 UPPER( ) 函数。

当前的排序次序将影响字符串比较的结果。例如,当把排序次序设为“General”时,下面的表达式返回“真”(.T.):

?"A" = "a"
?"Straße"="Strasse"
?"æ"= "ae"

然而,当使用“Machine”排序次序时,所有这些语句返回“假”(.F.)。因为字符串是按照字节进行精确比较的。

字符串比较操作符 (==) 同于按值比较,或使用“Machine”排序次序(即按字节比较)进行的比较。例如,下面的语句返回“假”(.F.):

? "Straße" == "Strasse"

注释 当使用字符串比较操作符 (==) 时,Visual FoxPro 将忽略 SET EXACT 设置。

使用 SEEK

当在执行一个部分查找时,Visual FoxPro 将忽略注音符号。如果表达式长度小于关键字长度则发生部分查找。如果注音符号很重要,则应考虑使用 SCAN FOR ... ENDSCANLOCATE FOR ... CONTINUE,而不是 SEEK

使用 SCAN 和 LOCATE 比使用 SEEK 有如下的优点:

使用 SELECT - SQL

SELECT - SQL 命令使用当前的排序次序,如果拥有基于“General”排序次序的索引标识,并且当前的排序次序(由 SET ('COLLATE') 返回)为“Machine”,则 SELECT - SQL 的结果则基于“Machine”。

要使用当前排序次序,请使用 SELECT - SQL的 ORDER BY 子句。

使用索引

排序次序决定了索引表中记录的排序。在使用带排序次序的索引时请考虑如下规则:

处理双字节字符集

Visual FoxPro 支持 DBCS(双字节字符集)— 用一个以上的字节代表一个字符的字符集。某些语言文字是双字节字符集,象简体中文、繁体中文、日文及韩文。

Visual FoxPro 支持 DBCS,这样就允许您创建国际化的应用程序。例如,如果您运行的是日语版本的 Windows,则可以用一个美语版的 Visual FoxPro 创建一个日语的应用程序。Visual FoxPro 的 DBCS 函数不仅可在日文字符集中正常的运行,而且支持日文排序序列。

注释 Visual FoxPro 为 DBCS 环境提供处理字符串的程序设计函数。有关详细内容,请参阅本章稍后的“在 DBCS 环境下处理字符串”

使用 DBCS 字符命名对象

Visual FoxPro 允许您使用 DBCS 字符命名应用程序中的元素。一般在 Visual FoxPro 中,元素名称需要遵循以下约定:

这些规则适用于变量、对象(窗口、菜单等等)、函数和过程名,类和子类名,别名及常量。也可以使用双字节字符命名文件。为避免文件名中的字符无意间被当成分隔符,将文件名放在引号内是最安全的。

注释 Visual FoxPro 中字串长度限制是以单字节字符数描述的。字段名、索引表达式、变量名、窗口名等使用双字节字符,可以显著地缩短名字的长度。例如,在自由表中一个字段名最多可以使用 10 个字节,所以一个字段名可以由 10 个单字节字符组成,但是只能有 5 个双字节字符。有关 Visual FoxPro 系统容量的详细内容,请参阅“Visual FoxPro 系统容量”

排序 DBCS 数据

为了有助于在 DBCS 环境下排序信息,Visual FoxPro 支持简体中文、繁体中文、日文及韩文的排序序列。排序序列帮助您为每种文字正确排序表中的字符字段。

下表列出了 Visual FoxPro 排序序列的选项及其所对应的语言。

选项 语言
JAPANESE 日语
KOREAN 朝鲜语
PINYIN 简体中文
STROKE 简体与繁体中文

有关指定排序序列的详细内容,请参阅本章稍前的“指定排序次序”

创建或修改程序

遵循如下规则,可以避免一些代码的本地化问题。

测试国际化版本

对于您的应用程序,确定 Visual FoxPro 正在运行何种语言非常重要,可以调用 VERSION( ) 函数。这样知道语言环境后,就可以帮助您确定显示何种文字,如何设置数据格式等等。例如,下面的代码确定了 Visual FoxPro 运行的语言环境,然后运行指定语言的表单:

IF VERSION(3) = 34 THEN
   * Running in Spanish--display Spanish form
   DO FORM CST_SPN.SCX
ELSE
   * Display English form
   DO FORM CST_ENU.SCX
ENDIF

注释 只有 Visual FoxPro 3.0b 以上的版本支持双字节字符串。如果应用程序依赖于 DBCS 功能,应该调用 VERSION(1) 函数查看 Visual FoxPro 版本号。

使用字符串

在代码中直接使用字符串会使本地化十分困难。例如,在代码中,不要把日期和货币标志包括在字符串中。如果可能,使代码从不同于源程序的文件或表中检索字符串。

注释 当把所有的字符串移出源程序时,代码的运行效率会受到影响。例如,程序如果需要在一个循环内查找字符串,移出字符串后程序的性能就会降低。

对于将要转换的应用程序,处理字符串的一种方法是在整个应用程序中使用字符串常量。可以在一个单独的文本文件中定义有关这些常量的文本,程序可以使用 #INCLUDE 预处理器引用这个文件。例如,可以使用 ERR_FILE_NOT_FOUND 常量,而不是嵌入“没有找到文件。”错误信息。这个常量的文本在名为 ERR_TEXT.H 的文件中。使用这种技术的程序可以如下所示:

#INCLUDE ERR_TEXT.H

* processing here

IF ERR THEN
   MESSAGEBOX( ERR_FILE_NOT_FOUND )
ENDIF

本地化应用程序时,转换器可以创建一个本地特定版本的错误文本文件,然后重新编译应用程序。

在 DBCS 环境下处理字符串

Visual FoxPro 提供能处理包含单、双字节字符的字符表达式的函数。在开发应用程序时使用了 DBCS 字符串函数,那么在一个字符串中计数、定位、插入或移去字符时,您不必编写额外的代码来测试双字节字符。

大多数 DBCS 函数等价于与它们相应的单字节函数,除非函数名有 C 后缀来区分它们。可以将这些函数用于单字节和双字节数据;对于这些函数,传递单字节数据和双字节数据,返回的结果相同。另有一些函数只帮助您处理双字节环境中的数据。

DBCS 字符串函数 说明
AT_C( ) 返回在一个字符串中另一个字符串的位置(区分大小写),从左边开始计算。
ATCC( ) 返回在一个字符串中另一个字符串的位置(区分大小写)。
CHRTRANC( ) 替换一个字符串中的字符。
IMESTATUS( ) 在浏览窗口中切换双字节编辑方式。
ISLEADBYTE( ) 检查一个字符是否是一个 DBCS 字符。
LEFTC( ) 返回一个字符串最左边的字符。
LENC( ) 返回一个字符串中的字符数。
LIKEC( ) 确定两个字符串是否匹配。
RATC( ) 返回在一个字符串中另一个字符串的位置(区分大小写),从右边开始计算。
RIGHTC( ) 返回一个字符串最右边的字符。
STRCONV( ) 在单字节与双字节表示方式之间进行转换。
STUFFC( ) 将一个字符串中的字符用另一个字符串替换。
SUBSTRC( ) 返回一个子字符串。

当处理双字节字符串函数时,请记住变量、名称等等的最大长度限制都是减半的。有关 Visual FoxPro 系统容量的详细内容,请参阅“系统容量”

注释 Visual FoxPro 早期版本不支持 DBCS 函数,调用它们可能会造成意想不到的结果。如果应用程序中使用了任何 DBCS 函数,请使用 VERSION(1) 函数来核实 Visual FoxPro 的版本是否比 3.0 高。

处理日期、时间和货币的格式

为了使日期、时间和货币的格式符合用户的使用习惯,可以使用多种格式设置技术:

若要设置日期、时间和货币的格式

  1. 从“工具”菜单中,选择“选项”命令,然后单击“区域”选项卡。

  2. 若要使用 Windows“控制面板”建立的设置,请选择“使用系统设置”。

    - 或者 -

    为日期和时间选择一种语言或格式,然后选择货币和数字的格式选项。如果选择日期格式为“短格式”或“汉语”,就不能继续进一步指定日期格式的选项,然后从 Windows“控制面板”中读取此设置。

  3. 选择“确定”,则在本工作期中使用这些选项,或者“设置为默认值”使所作的更改成为 Visual FoxPro 的默认设置。

也可以使用 SET SYSFORMATSSET DATE 命令进行这些设置。通常,这些命令在初始化应用程序(例如在配置文件中)时使用。SET SYSFORMATS 命令默认值为 OFF ,所以在启动应用程序时将其值设置为 ON 。

通过设置文本框的 Format 属性,可以在单独的文本框中建立数据有效性检查。但是因为文本框的格式优先于系统范围的格式,在使用不同日期、货币等格式的环境中本地化应用程序时,这可能会造成麻烦。

使用预处理指令

可以使用预处理指令,创建用于不同区域的应用程序变量。这些指令可以控制应用程序中代码的编译,其中包括 #INCLUDE#DEFINE#UNDEF#IF...#ENDIF 结构。

使用预处理指令可以快速产生应用程序变量。然而,这些预处理指令有如下缺点:

在国际化应用程序中管理文件

“项目管理器”有助于组织一个国际化应用程序。在项目中,可以将应用程序的各部分集中到一起,如表单、菜单、程序和报表等。项目可以确保在为某个目标市场编译应用程序时各部分都是最新的。

与 .dbf 文件不同,查询和源程序这类文件没有代码页标记。这就意味着,要想正确的使用这些文件,就必须了解这些文本文件所用的代码页。使用“项目管理器”,可以知道文本文件所用的代码页。有关详细内容,请参阅本章前面的“指定文本文件的代码页”

发布本地化的运行时刻文件

如果将应用程序与 Visual FoxPro 的运行时刻版本一起发布,可能会需要包含一个指定区域的资源文件。该文件包含了 Visual FoxPro 用于同用户进行交互的对话框和其他用户界面元素。对于不同语言的 Visual FoxPro,运行时刻资源文件会不同。

通常,只有在下列各种情况同时存在时,才需要关心指定区域的运行时刻资源文件:

有关将运行时刻文件与应用程序一同发布的详细内容,请参阅第二十五章“生成可发布的应用程序”和第二十六章“创建发布磁盘”

运行时刻资源文件是用 Vfpaaa.dll 的格式命名的,其中“aaa”三个字母是代号,它代表了所用的语言。例如,代号 ENU 代表了美国英语 (United States English),代号 DEU 代表了德语 (German),而代号 FRA 代表了法语 (French)。因此,这些语言的运行时刻资源文件就分别是 Vfpenu.dll、Vfpdeu.dll 和 Vfpfra.dll。

即使不想将 Visual FoxPro 中的任何界面元素作为自己的应用程序的一部分,也必须至少包含一个运行时刻资源文件。默认情况下,Visual FoxPro 包含了与您的程序副本一起提供的资源文件。例如,如果使用美国版本的 Visual FoxPro 开发应用程序,并且在应用程序中包含了运行时刻文件,Visual FoxPro 就自动包含 Vfpenu.dll。如果不想使用指定区域的资源文件,可以简单地将该默认的资源文件作为应用程序的一部分发布。

安装应用程序时,用户可以指定运行时刻资源文件,这需要在 Windows 系统注册表中注册,或者使用一个命令行开关。

若要指定一个运行时刻资源文件

启动运行时刻应用程序时,Visual FoxPro 首先根据 L 开关然后根据注册表的设置搜索资源文件。如果,这些设置都没有指定一个特定区域的资源文件,Visual FoxPro 使用当前的本地系统 (Windows) 动态地构造一个 DLL 文件名。因此,如果应用程序指定区域的资源文件与用户的 Windows 版本的本地系统相匹配,则不需要明确指定资源文件。但是,如果想确保加载了正确的文件,最安全的办法是不依赖于系统默认设置。