程序操作一览表

  1. 程序向用户直接或间接显示可翻译消息吗? 间接消息的示例是那些保存在库中的消息。

    若是:

    • 这些消息是通过消息工具子例程从程序外部化的吗?
    • 是否为所有这类消息提供了消息源文件?
    • 程序运行于哪个语言环境之下?
      • 如果程序运行于由语言环境环境变量确定的语言环境中,您是以以下方式调用 setlocale 子例程的吗?
        setlocale(LC_ALL, "")
        注: 按预定义的分层顺序排列的语言环境类别为: 全部 (LC_ALL)LC_COLLATELC_CTYPELC_MESSAGESLC_MONEALLC_NUMERICLC_TIME
      • 如果程序运行于“C”语言环境,除了在语言环境环境变量指定的语言环境中显示消息之外,您是否以以下方式调用 setlocale 子例程?
        setlocale(LC_MESSAGES, "")
      • 调用 setlocale 子例程后,是否以以下方式调用 catopen 子例程?
        catopen(catalog_name, NL_CAT_LOCALE)
      • 是否以正确的目录名调用了 catopen 子例程?
      • 请参阅 消息工具 ,以获取有关可翻译消息的更多信息。
  2. 程序比较文本字符串吗?

    若是:

    • 比较字符串是否是仅仅为了检查相等性?

      若是:

      • 可使用 strcmpstrncmp 子例程。
      • 请不要使用 strcollstrxfrm 子例程。
    • 比较字符串是否是为了根据当前语言环境的定义来确定字符串排序的先后关系?

      若是:

      • 以以下方式调用 setlocale 子例程:
        setlocale(LC_ALL, "")
      • 请使用 strcollstrxfrmwcscollwcsxfrm 子例程。
      • 请不要使用 strxfrmstrncmp 子例程。
  3. 程序解析文件路径名吗?

    若是:

    • 如果查找 /(斜杠),可使用 strchr 子例程。
    • 如果查找字符,请注意文件名中可能包含多字节字符。 在这样的情况下,以以下方式调用 setlocale 子例程,并使用相应的搜索子例程:
      setlocale(LC_ALL, "")
  4. 程序使用系统名称吗?比如节点名、用户名、打印机名和队列名。

    若是:

    • 系统名称可能有多字节字符。
    • 为了标识多字节字符,请首先通过以下方式调用 setlocale 子例程,然后使用库中的适当子例程。
      setlocale(LC_ALL, "")
  5. 程序使用字符类属性吗?比如大写、小写和字母。

    若是:

    • 以以下方式调用 setlocale 子例程:
      setlocale(LC_ALL, "")
    • 不要对字符属性作假设。 总是使用系统子例程来确定字符属性。
    • 字符是否限定为单字节代码集?

      若是:

      • 请使用下列其中一个 ctype 子例程:isalnumisalphaiscntrlisdigitisgraphisprintisspaceisxdigit

        若否,字符可能是多字节字符:

      • 请使用 iswalnumiswalphaiswcntrliswdigitiswgraphiswloweriswprintiswpunctiswspaceiswupperiswxdigit 子例程。
  6. 程序转换字符大小写吗?

    若是:

    • 以以下方式调用 setlocale 子例程:
      setlocale(LC_ALL, "")
    • 字符是否限定为单字节代码集?

      若是:

      • 请使用下列 conv 子例程:_tolower_toupper tolowertoupper
      若否,字符可能是多字节字符:
      • 请使用 towlowertowupper 子例程。
  7. 程序跟踪 tty 终端上的光标移动吗?

    若是:

    • 以以下方式调用 setlocale 子例程:
      setlocale(LC_ALL, "")
    • 您可能需要确定字符的显示列宽。 可使用 wcwidthwcswidth 子例程。
  8. 程序执行字符 I/O 吗?

    若是:

    • 以以下方式调用 setlocale 子例程:
      setlocale(LC_ALL, "")
    • 字符是否限定为单字节代码集?

      若是:

      • 使用以下子例程系列:
        • fgetcgetcgetchargetw
        • fgetsget
        • fputcputcputcharputw
        • printfscanf
      若否:
      • 使用以下子例程系列:
        • fgetwcgetwcgetwchar
        • fgetwsgetws
        • fputwcputwcputwchar
  9. 程序遍历字符数组吗?

    若是:

    • 数组是否仅限单字节字符?

      若是:

      • 不需要 setlocale(LC_ALL, "")
      • 如果 p 是这个单字节字符数组的指针,可使用 p++ 来遍历该数组。
    若否:
    • 以以下方式调用 setlocale 子例程:
      setlocale(LC_ALL, "")
    • 使用 mblenwcslen 子例程。
  10. 程序是否需要知道代码集中用来编码字符的最大字节数?

    若是:

    • 以以下方式调用 setlocale 子例程:
      setlocale(LC_ALL, "")
    • 使用 MB_CUR_MAX 宏。
  11. 程序格式化日期或时间数值量吗?

    若是:

    • 以以下方式调用 setlocale 子例程:
      setlocale(LC_ALL, "")
    • 使用 nl_langinfolocaleconv 子例程来获得特定于语言环境的信息。
    • 请使用 strftimestrptime 子例程。
  12. 程序格式化数值量吗?

    若是:

    • 以下列方式调用
      setlocale
      子例程:
      setlocale(LC_ALL, "")
    • 使用 nl_langinfolocaleconv 子例程来获得特定于语言环境的信息。
    • 根据需要,使用下面这对子例程:printfscanf
  13. 程序格式化货币量吗?

    若是:

    • 以以下方式调用 setlocale 子例程:
      setlocale(LC_ALL, "")
    • 使用 nl_langinfolocaleconv 子例程来获得特定于语言环境的信息。
    • 使用 strfmon 子例程来格式化货币量。
  14. 程序搜索字符串或查找字符吗?

    若是:

    • 是否在单字节文本中查找单字节字符?
      • 不需要 setlocale(LC_ALL, "")
      • 可使用标准 libc 字符串子例程,如 strchr 子例程。
    • 您在查找 0x00-0x3F(唯一代码点范围)范围内的字符吗?
    • 不需要 setlocale(LC_ALL, "")
    • 请使用标准 libc 字符串子例程,如 strchrstrcspnstrpbrkstrrchrstrspnstrstrstrtokmemchr 子例程。
    • 您在查找 0x00-0xFF 范围内的字符吗?
    • 以以下方式调用 setlocale 子例程:
      setlocale(LC_ALL, "")
    • 有两个方法可用:

      使用 mblen 子例程跳过多字节字符。 然后,在遇到单字节字符时,检查相等性。 请见一览表第 2 项。

      将搜索字符和被搜索的字符串转换为宽字符形式,然后使用宽字符搜索子例程。

  15. 程序执行正则表达式模式匹配吗?

    若是:

    • 以以下方式调用 setlocale 子例程:
       setlocale(LC_ALL, "")
    • 使用 regcompregexecregerror 子例程。
  16. 程序要求用户提供肯定/否定响应吗?

    若是:

    • 以以下方式调用 setlocale 子例程:
       setlocale(LC_ALL, "")
    • 在消息目录中放置提示。 使用 catopen catgets 子例程检索消息目录并显示提示。
    • 使用 rpmatch 子例程来匹配用户响应。
  17. 程序使用特殊的表框绘制字符吗?

    若是:

    • 不要使用特定于代码集的表框绘制字符。
    • 而是使用在 terminfo 文件中指定的表框绘制字符和属性。
  18. 程序执行此处未提及的特定于文化或特定于语言环境的处理吗?

    若是:

    • 外部化特定于文化的模块。 不要使它们成为可执行程序的一部分。
    • 使用系统提供的子例程在运行时装入模块,如 load 子例程。
    • 如果系统未提供这样的工具,那么静态链接它们,但以模块方式提供它们。