标准内容
本标准代替GB/T16681—1996信息技术开改系统中文界面规范》。本标准与GB/T16681—1996相比,主要变化如下:GB/T16681—2003
1.原国标的国际化函数的符界面部分16类共77个函数(原是以UNIXSRV4.0为依据的)用ISO/IEC 9895.1990/Arnd. 1.1995 Programming languages-- C Arneudment 1: C Integrity 的规定,作了校订。
2、原源国标的图形界面部分的函数是以X11R5为基砸的,已过时,现依据X11R6并参照」二些实现系统、重新制定。
3、原国标附录A,是以GB2312一1980为依据制定的POSEX中文特征文件。现国家要求,中文系统的字符集,应以GB18030·2000为依据。为此,制定了以GB13030·2000为依据的POSIX中文特征文件,作为本标准的正式文件,放在附录A中。4.参照Linux的L118NUX2000,补充了在L118NUX2000中规定,而原国标中未包含的几十个国际化的字符界面的函数。目前,坟在附录(中。本标准的附录A是规范性附求,附录B和附录C是资料性附录。本标雅出中华人民共和国信息产业部提山。本标雅由信息产业部电子工业标准化研究所归口。本标准起草单位:中软网络技术股份有限公司、信息产业部电子工业标推化研究所。本标准主要起草人:周明德、冯惠、欧阳生、郭峰。1范围
信息技术开放系统中文界面规范GB/T 166B1—2003
本标准定义开放系统中文平台应用程序编程界面、I/O服务功能界面以及图形界面。本标准适用于开放系统中文平台的开发、应用和基于该坏境的中文处埋软件的集成。2规范性引用文件
下列文件巾的条款通过本标准的引用而成为本标推的条款:凡是注目期的引用文件·其随后所有的修改单(不包括谢误的内容)或修订版均不适用于本标准.然而,鼓励根据本标准达成协议的各方研究是否可使用这些文件的最新版本。凡是和注且期的引用文件,其最新版本适用于本标推。GI3/T1988—1998信息处理信息交换用-七位编码字符集(eqVTS0)646:1991)GB2312—1980信息交换用汉字编码字符集基本集GB/T52677994信息处理-七位和八位编码字符集用的控制功能(idtISO6429:1988)GB/T7408—1994数据元和交换格式信息交换口期和时间表示法e9VIS08601:1988)GB/T11383—1989信息处理信息交换用八位代码结构和编码规则(idt[SO48731986)GB12345—1990信息交换用汉字编码字符集铺助集G13000.1一1993信息技术,通用多八优编码学符集(U$第部价:体系结构与基本多支科平面(idt 1S0/IEC10646-1:1993)GB/T13846—1992图形信息交换用矢汉宁仿未体字模集及数据集GB/T 138471992
图形信息交换用矢量汉字楷体字模集及数据集GB/T138481992图形信息交换用失量汉字黑体字模集及数据集(B3/14246、1一1993信息技代可移植操作系统界面第一部分:系统应用程序界面(POSIX1)(idtISO/IEC 9945-1:1990)
GB/T15272—1994程序设计语C(idt150/1EC9899:1990)GB18030一2000信息摄术佰意交换用没产编码产符集基本集的打充1S0/IE(9945-2:1993(P()SIX.2)信息技术可移植操作系统界面第二部分:Shel和实用程序
XHI)5单 IJNIX 规范,V 2 系统接定义,发行 5(The Ope Group CAE 规范 C605)3术语和定义
下列术语和延义适用于本标准。3.1
多字节字符moltibyte character用若干个字节表示的字符。
单宇节宇符single-byte character用个学节表示的字符。
宽字符widecharacter
为了统一地处理单字节宁符与垒字节符,而采用的具有统一编码宽度的宁符的内部裴示。1
GB/T 16681—2003
字符宽度character width
字符所占用的存储单位数或显示列位置数。字衍宽度有显示宽度与存储宽度之分,而且字符的显示宽度与行储宽度不总是致的。3.5
输入法inputmethod
为输人特定字符集中字符而定义的方法,3. 6
输入提示屏inptpromptscreen
计算机屏葬上输人法求的显区。3.7
热键hotkey
计算机键盘上输人法要求的方式切换链。3.8
点阵汉dot-matrixChinesecharacter用位映像图描的汉字字符。
矢量轮哪汉字
vectar outline Chinesc character用石向线段描述没字轮解的叔字字符,3. 10
曲线轮廊汉字
curve outline Chinese characler用特定曲线述汉字轮廊的汉字字符,3. 11
开放系统opensystem
一种按标准建立起来的计算机系统。开放系统的主要特征是:兼容性(crmjatihility),可移植性(portability):五操作性(interuperability):可扩展性(scaliabili-ty),
中文界面规范chinese interface speciflcation是指以国际化和本地化的方进行各国语言处理来实现中文信息处理的系统在字符处理和图形用户界面情说下必须提供的国际化和本地化的接口函数。4要求
4.1总体要求
4.1.1标准的符合性
具体实现应遵循本标准:此外,还应遵循操作系统的其他标准,凡本标推中未明确楚义的符号,可参阅相应的标谁。4.1.2C语言约束
本标准使刃按GB/T152721994描述编程界面,并不限定在具体实现时所使用的编程语言。4.1.3国际化/本地化(118.N/L10N)模式其体实现应采用P()SIX标准的闲际化/本地化模式,4.1.4字处理原则
在系统宁处理中·必须以字符为单位,而不能以字节为单位。芥无特殊说明,本标准中所用的“字符”既可以是单字节字符也可以是多字节学符。2
4.1.5前导文件
若无特殊说明.本标准所引用的前导文件与XBD5·-·致。4.2国际化
GB/T 16681—2003
国际化(lnternationalization)是规定在一个计算机程序内部的能力,使它适应于不同的本地语言、本地风俗和编码字符集。
本标准定义一组国际化的应用程序编程界面。由于多字节字符事实上的存在,并表现为不等长,为了处理上的一致性、规范性,字符处理时应以等长的宽字符表示多字节学符。
4. 2. 1 标准 C多字节功能
a)把字符转换成宽字符。
mbtowe
# inelude -.stdlib. h.-
int mbtowe(wchar_t * pwe,canat rhar # $,sizc_t n);说明
如果s不是空(null)指针,那么mbtowe<)先确定由s指向的字符的字节数,然后确定与该字符相刘应的wchar_t型的宽字符代码值(与空字符等价的宽字符代码值是零)。如果该字符是有效的并且pwc不是空指针、mbtowe:()把宽字符代码值存放在pwc指向的目标中。本俩数受当前语境LC_CTYPE影响,对于依赖于状蕊的缩码,通过将自变量S置为空来调用本函数,使函数没置为初始状态;后续的调用,如果自变量非空,则使函数的初始状态根据需要改变。如果编码做懒于状态,那么变虽s为空指针的调用使本函数返回一个非零值,否则返回零。如果在实现中使用一些特殊字节来改变切换状态,那么这些字节不生成独的宽字符代码:而是与一个相邻的宁符组合在一起,改变当前的LC二CTYPE使本函数的初始状态不确定。本函数最多检查指向的数组中的n个节。返回
尚s是空指针时,如果宁符编码依赖于状态,那么函数mbtowcl)返回一个非零值;如果编码小依赖于状态,则函数返回掌值。当是非空指针时,如果s指向空字节,那么 niltowc()返回零或者如果n个或少于n个字节组成了有效的多字节字符,则返回多节的字符数或者如果是无效字符,则函数返回一l并置errno以示出错。不会返回大于n或者 MB_CUR_MAX宏的值。出错
mbtowc()函数遇到以下情况,则失。若tEILSEQ
检到无效字符序列。bzxz.net
h)获取学符的字节数。
mbslen
=includestdlib.h>
int mblen(const char * s,size_t n) :说明
如果不是空指针,mllen()确走由s指向的字符中的字节数。除了mhtowc:的切换状态不受影响之外,它等价于:
GB/T 16681—2003
mliowe((wchur_l +0,$.n):
本函数受当前语境LCTY卫F影响。对于依赖于状态的维码,通过将自变量S置为空来调用本函数,使函数没置为初始状态,后续的调用,如果自变量非空则使数的初始状态根据需要改变。如果编码依赖于状态,那么自变鼠\为空指计的调用使本函数返回一个非值,否则返回零,如果在实现中使用些特殊字节米改变切换状态,那么这些字节不生成独守的宽字符代码,而是与一个相邻的学符组合在一起,改变当前的LC_CIYPE使本函数的初始状态不确定。
当是空指针时,如果字符编码依赖于状态,那么函数 niblcn()返回一个非零值:如果编码不侬赖丁状态,则函数返回零值。当 s足非空指针时,如果 s指向空字节,那么 mhlen()返回李;或者如果几个或少于n个字节组成了有效的多字节字符,则返回多字节字符的字节数:或者如果是无效字符,则函数返回--1并置errno以示出错不会返同大于n或者MH_CUIR_MAX宏的值。出错
mblen()函数避到以下情况,则失败。若:EILSEQJ
检测到无效的字符疗列。
C)把宽字符转换为宁符。
# include-stdlib. h.
int wctomb(char * s,wehar_t wchar);说明
wr:tamh>确定wchat表示的宽符(包括切换状态的变化)所对应的字符的字节数,并把刘应的字符(可能是多字节和改变切换状态的特殊字节)存改在:(如果:不是空指针)指向的日标数组中。最多存放ME_CUR_MAX个字节。如果 wchar 的值为零,wctumh()被置为初始切换状态。
本菌数受当前语境ICPF影刷,对于依赖于状态的绍码,通过将自变量$置灯空来调用本函数,使函数设置为初始状态后续的调用,如果白变量s非空,则使函数的初始状态根据需要改变。如果编码依赖于状态,那么白变量”为空指针的调用使本函数返回一个非零值,否则返回零。如果在实现中使用·-些特殊字节来改变切换状态,那么这些字节不生成独立的宽字符代码,而是与一个相邻的字符组合在一起。效变当前的 LC_CTYFF使本函数的初始状态不确定。
当s是空指针时,如果字符编码依赖于状态,那么函数 wco1nil()返回一个非零值;如果编码不依赖于收状态,则函数返回零值。当s是非空指针时,如果wch不对应有效的学符,那么函数返回一l:否则返wchaI对应的字符的字节数。不会返回人于MH_CUR_MAX宏的值。出销
未定义出错值。
d)把字符中转换为宽字符串。
mhsiowes
# inrlurde-stdlib, h.
size_t mbstowcs(wchar_t *pwes,const char *,ize_t n):说明
GB/T16681—2003
mbstowcs()把从s指向的数组以初始切换状态开始的字符序列转换成对成的宽字符代码序列,并把不多于n个宽字符代码存放在Pwcs指间的数组中,空符(空符将被转换成一个值为零的宽字符代码后面的字符不会被检查和转换。除了mbtowc()划换状态不受影响外,每个字符的转换就像调用mbtowc)一样。pWCs 指向的数组中不会修改多于 1 个元素,如果复制目标重叠,其行为术定义本函数受当前语境的LC_CTYPE影响。如果pwes是空指针,mbstowcs>返回格个数组要求的长度(不受n的值的影响)。但无值存储。返间
如果避到-一无效享符.mbstowcs()返回(sizc_1)1.并R置 trro以示出错,否则 mhstowcs()返回被转换的数组元素的个数(或者如果wcs是空指钳,则是所的个数),不包括作为终止符的掌代码。如果返回慎是口,数组不以零代码终止。错
rnhstewas()遇到以下情况,则失败。若:[FILSEQ]检测到无效的字节序列。e)把宽字符串转换为符串。
westombs
ineludex,stdlib, h?
size_t wcstombs(char * s+const wchar_1 * pwcs.size._1 n):说明
wcstombs()转换由pwcs指向的数组中的宽字符代码序列为以初始切换状态开始的符序列,并把这些字衔存放在。指向的数组中,若超出了总共为几个字节的限制或者存了一个空字节,转换停止。除了wetomb)的切换状您不受影响外,每个宽宁符的转换就像调用wetomb)-样,
木丽数受当前语境的LC_CTYPE影响,指问的数组中最率修改n个字节。如果复制目标重叠,其行为末定义。如果5是一个空指针,wtornlis)返回整个字符数组所需的学节数(不管n的值)。但无值存储,返间
如果遭到宽字符代码,它不对底有效亨符(单字节或多字节),wcstoinbs()返回(size_t)一l:否则.wcstombs(>返回存储在字符数组中的字节数,不包括作为整止符的宁字节,如果返回值是Ⅱ,数组不以空终止。出错
GB/T 16681--2003
wcstombs()遇到以下情况,则失败。节:EELSEQJ
4.2.2I/0功能
宽字符码没有相对应的有效字符。a)从流中获取宽字符代码,
fgetwc
# includestdio, h'.
# include-.. wehar. h.
witnil_t fgetwe(FILF * stream);说明
fgetwr)从stieam指向的输人流中获取下一个字符(如果存在).将该字符转换成对应的宽字符化码,作且下移相关的流的文件指示器(如果已定义)。如果出现错误,流的文件位置指示器的值不确定。fgetwc()可以为更新而标记 stream 相关的文件的 st_atime 域。如果 fgetc()、fgetwc(),fgetws(),fread(),fscanf(),gete(),getehar()、gets【)或scanf()第--砍成功地从etreaim 中获取的数据.不是前而 ungetc()或者 ungetwc()的调用提供的:则为更新而标记sl_atine 或
fgetwe:( )的成功调用将从 streHm指向的输入流中读取字符并返对应的 wint_t.型的究字符代码。如果流到了文件尾,流的文件结束指示器将被设署并Hfgetwc)返回WEOF。如果发牛读错误,设督流的出错信息指示器,Igetwe()返回WE(>F并且置 errno 以示[li错。出错
[gct.wc(将失败若需要读数据月 :对于基于stream的文件描述符设置U_NONBLOCK标志H进程在EAGAIN!
fgetwer)操作期间将被延退:
LEADF」
[EINTR
基于strean的义件描述符不是为读打开的有效文件描述符读操作由于接收到信号而终止,无数据传送。发生物理的错误,或在后台进程组中的进程企图从它的控制跨端读且或者进程正忽略或阻断SIGTTIN信号或是孤儿进程纽,此错误也可由实现有关的原因产生。
[EOYERFLOW」
文件是逆近义件且企图在流和应的最大文件偏移处或超出处读。fgetwc()遇到以下情况,则失败,若:LENOMEM]
[ENXIO]
[EILSFQ]
光充足的存储空间可用
请求不存在的设备或蹈出了设备的能力。从输入流得到的数据不形成有效字符。b)从流中获取宽字符。
# inclrdesstdlih, h
# inelude-wchar. h.>
wint_t getwe (FILE * xtream);说明
GB/T 16681--2003
getwc()等价于fgetwc(),除了作为宏实现,它可能多次计算 stream,所以自变量不能是具有边缘效应的表达式。
见 fketwe( ),
见 fgetwc(.
)从标雅输人中获取宽字符,
getwchar
#in:ludewehar.h
wint_t getwchar(void):
getwchar()的功能等价于getwc(stdin)。返回
见 fgetwc()。
见fgetwc()。
)从流中获取一宽字符串。
fgetws
#include
#includewehar.h>
wchar_t *fgetws(wchar_t *ws,int n,FILE * streani):说朗
fgetws()从stream中不断读取字符并转换成对应的宽字符代码:把结果疗放在wa指问的wchar_t型数组中,直到读取了n一-1个字符,或者是退到换行符(换行符被转换并存放到ws),或者遇到文件尾为止。于是用以宽字符表示的空符结束ws宽宇符。如果出现错误,流的文件位置指示器的值将不确定。fgetws)可以为更新而标记 sircam相关的文件的 st_atinie域。如果 fgetc(),Igctwe()fgetws()fread(),fscanf()、gete()、gciehar()、gets()或scanf()第一-次成功地从strea 中状取的数据,不是前面 ungctc)或者 ungetw:()的调用提供的,则为更新而标记st_atime 域。
直至成功完成:gtws()返回ws。如果退到文件尾,设置流的文件结束指示器并月Igtlws()返回空指针。如果发生读错误,设置流的出错信息指示器,getws()返问空指针并凡督errno以示出错。
见 fgetwr0。
GB/T 16681—2003
e)在流上输出宽字符代码。
fputwe
= ineludesidio, h
=include.wehar.b,
wini_t fputwe(wint_t wc,Fll.E * stream):说明
fputwe)把与宽字符代码wc对应的于符写到sircam指向的输出流中由流相关的文件位暨指示器(若已定义)指示的位置,并月适当下移流的文件位置指示器,如果文件不能支持定位请求,或者流是以附加方式打开的,字符物附加到输出流后。当写字符出现错误时,输出文件的切换状态将留在未定义状念。在对同-·流的fnutwc()与下次fflush()或felose)的成功调用之间,或者与调用exil()或abortc)之间,将为更新而标记文件的st_ctime和st_mtime域。返回
如果成功,fputwe)返可wc。否则返回wEOF,设置流的出错信息指示器,并且置errno以示出错,
fputwe()将失跛,或者流是末缓冲的或在trem 的缓冲器中的数据需要写且:LEAGAIN]
作中被延迟,
[EBADF]
[EFHIG]
TEFBIGJ
EINTRJ
对丁基于 stream的文件描述符设置 _NONB[.OCK 标志且进程在写操萃本strca 的文件描述符不是有效的为写而打升的文件描述符。企图写超出最大文件寸或进程文件尺寸限制的文件。文件是普通文件且企图在与相应的流相关的最大偏移处或超出处写。写操作由于接收了一信号而终止H无数据转换。发生「物理I/)错误,或进程后台进程组的成员企图写至它的控制终端,设骨 TOSTOP 进程既不忽略也不阻断 SICTIOU H进程的进程组是孤儿进程组。此错误也可在实现有关的案件下返回,[ENOSPC'
[EPIPE]
在包含文件的设备上尤自由空间,企与至末由任何进程为读打开的管道或FIFO。向进程送SIGIPF信号。fputwe()遐到以下情况,则失瞰。若:LENOMEM
[FILSFQ]
无充足的可用的存储空间。
在不存在的设备上请求或请求超出了设备的能力。宽字符码WC本相应有效字符。
[)把一宽字符输出到流上。
= inrludes.stdio,h>
- inelude-.wehar. h.-
wint_t putwc (wint_t wc,FILE * sirean).说朔
putwc(>等价于putwe(),除了作为宏实现.它能多饮it算strean,所以自变量不能是具8
有边缘效应的表达式。
见 fputwc( )。
见fputwe()
g)把宽产符与至标准输出设备,名称
pulwehar
# includewehar.h
wint_t putwchar (winir_1 we);说昕
putwchar(we)等价于putwe(wc,stdout)。返画
见Iputwet
见[pulwet )。
h)在流上输出宽宁符申。
fputws
#include3rdio.h
inelude..wr:har,h
intfrutwx(consLwelar_tws,FILE*stream):说明
GB/T16681—2003
fpuitws()把与ws指向的(以空结束的)宽字符串对应的字符写入str(m指向的流中。不写人与整止的空宽字符代码对应的字符。在对同一流的fputwc<)与下次fflush(>或fe:tos心()的成功调用之间,或者与调用exit()或abarl)之间,将为更新而标记文件的 st_ctimc和 st_mtirme域。返回
如果成归,fputws()返见一非负数;否则返回一1,置流的出错信息指示器并且骨errno以示出错。
见fputwe()
i)把一宽字符代码放回输人流。名称
ungetwe
# inelude..stdio. h...
# includewehar, h.
wint_tungetwe(wint_t.wc,FIi.E*sircan);说明
ungetwe:()把与宽字符代码wc和对应的字符放回sircan指向的输人流。被放回的字符将9
GB/T 16681-—2003
在下欢流中读时接放回相反的顺疗这回。介于期间的文件是使函数see,tsetpos()或ruwirnid())的一款成功调用(用由stream指向的流)会废弃放回流(strean所指向的流)中的宁符。与流对应的外部存储将不做收变。放回一个字符是可以保证的,若ungc1.wc在同一流中调用太多次,而没有读文件或者文件定位操作来做间隔,操作可能失嫩。如果WC的值等于宏WEOF的值,操作失败并且输人流不做改变。Jre1wc()的战功调用将清除流的文件结束指示器。在读操作或者清除所有效回字符之后的文件位暨指示器的值与放同字符前是一样的。每一次ungetwc()的成功调用将使文件位置指示器减小(减小1或更多),如果在调用之前它的值是零,在调用之后它的值将不确定。
如果成功,ungCLwc()返回与政回字符相对应的宽字符代码值,否则它返回WE(F。出能
nngetwc()遇到以下情况,则失败。荐:[EILSEQ]
4.2.3串操作功能
检测到无效字符序列或宽字符码不相虚于有效字符。a)连接两个宽字符串。
WGseat
# inelude <'wchar. h?
wchar_t * wescat (wchar_t * wsl.const wchar_t * ws2);说明
wcscaL()把ws2指向的宽字符串的副本(包括终止的空宽字符代码)附加到wsl所指的宽字符串的未尾。WB2 的起始宽字符疆盖了 wrs1 末尾的空宽字符:如果复制自标重叠,该行为未定义。
wcscat()返回串wsl;不规定发生错误的返回值。出铝
未定义出错值。
b)两个宽字符中的部分连接。
wesneat
#include
wchal_t * wcsncat (wchar_t * wsl,const wchar_t * ws2,size_t n):说明
wcsncat)把ws2指向的数组中的最多n个宽字符代码(空宽字符及其宿面的宽字符代码不被加)谢加到ws1所指的免亨符串的来尾。Ws2的起始宽字符覆盖了wg1术尾的空宽字符代码。通常在结果中附加一个空宽字符代码。如果复制目标重叠,该行为未定义。返回
wcsncat(>返回串wsl;不规定发生错误的返回值,u
未建文山错值。
)比较两个宽字符串。
wcscme
inelude -. wehar, h..
int wcscmp (cunst wchar_t *wsl,const wchar_t * ws2):说明
wcst:np()比较wsl指向的宽字符串和ws2指问的宽字符串。GB/T 16681—2003
非零返同值的符号由被比较的目标中的第一对不同的宽字符码的道之间不同的符号确定。返回
wcscmp(>比较成后,根据wsl指向的字符大于,等于或小于ws2指向的字符:返回一大于,等于或小于零的整数。
未定义出错慎,
d)部分比较网个宽字符串。
wrsnemp
#ineludewchar.h
int wesncmp (cnnst wrihar_t*wsl,const wehar_twws2size_t n);说明
wcsncmp)比较wsl指向的宽字符事和ws2指向的宽字符申4最多n个宽字符代码(空宽字符后面的宽子符代码不被比较)。非零返回值的符号由被比较的目标中的第一对不同的宽字符码的值之间不同的符号确定。返回
wcsncmp>比较完成后,根据wsl指向的以空终止的数组大于,等于或小于ws2指向的以空终止的数组,返回·大于、等于或小于举的整数出错
未定义出错值,
心)复制一宽字符中。
wcscpy
# inelude wehar. h>
wchat _t * wesepy (wchar _1 * wsl,const wchar _i * ws2);说明
wcscpy()把ws2指向的宽字符中(包括终止的空宽字符代码)复制到wsl所指的数组中如果复制目标重叠,该行为未定文。返回
wcscpy()返回中wsl;不规定发生错误的返回值.11
小提示:此标准内容仅展示完整标准里的部分截取内容,若需要完整标准请到上方自行免费下载完整标准文档。