The Official GNOME 2 Developer's Guide GLib (三)
Yu
posted @ 2011年8月13日 17:50
in The Official GNOME 2 Developer's Guide GLib
with tags
c gnome gtk
, 2764 阅读
其实之前两篇都是在csdn一个博客上搞过来的,感谢那兄弟。以后我来接着翻译把 。。争取一年可以翻译完。。我的英文很菜,翻译的不好,轻喷。。。。。
1.4.4 Unicode和字符编码
C标准的字符串和上一节的字符串。在这些函数里面都不用担心长度的问题,因为每一个C标准的字符和gchar字符都是一个字节长。(PS:gchar只是char的一个define)
在本节中的函数跟上一节的有所不同,因为他们都是针对Unicode的字符和字符串。Unicode是一个广泛统一的字符集,可以表示地球上任何语言中的任何字符。Unicode可以用作通用字符集。(UCS;see ISO 10646)Unicode原本只有16bit的编码。经过不断的扩张。我们GLib可以支持三种不同的编码方案。(详见 man utf-8)
UCS-4是一个完整的32bit UCS兼容编码。(其实就是UTF-32,我就不翻译了直接贴wiki)
UTF-32 (或 UCS-4)是一種將Unicode字符編碼的協定,對每一個Unicode碼位使用恰好32位元。其它的Unicode transformation formats則使用不定長度編碼。
因為UTF-32對每個字符都使用4位元組,就空間而言,是非常沒有效率的。特別地,非基本多文種平面的字符在大部分文件中通常很罕見,以致於它們通常被認為不存在佔用空間大小的討論,使得UTF-32通常會是其它編碼的二到四倍。
雖然每一個碼位使用固定長定的位元組看似方便,它並不如其它Unicode編碼使用得廣泛。與UTF-8及UTF-16相比,它有點更容易遭截斷。即使使用了"定寬"字型,除非在一些非常有限的清況下,否則它並不會使得計算顯示一個字串的寬度更加容易。主要原因是,存在著一個字符位置會有多於一種可能的碼點(結合字符)或一個碼點用多於一個字符位置(如CJK表意字符)。結合符號也意味著,文書編輯者不能不能將一個碼點視同一個編輯上的單位。
(不过后面他注解了一些。我还是翻译吧)每一个UCS-4字符有4个字节长。用两个低位字节来表示Unicode(一般情况下高位的字节就为0).在GLib的数据类型UCS-4是gunichar。一个gunichar是标准的Unicode类型有32bit宽。在glib中某些函数用UCS-4字符串(gunichar *)。
UTF-16是原生编码().每一个UTF-16字符有2个字节长。GLib使用gunichar2类型来表示UTF-16字符。跟UCS-4一样,你可以看到UTF-16的字符串是(gunichar2 *)。
UTF-8是在实践中最重要的。因为UTF-8跟ASCII是兼容的。普通的ASCII有8bit长。但是其他的字符可能有2个字符长或者更长。所有文件里面ascii编码的格式都包含在utf-8的有效区间里面,但不能反过来。UTF-8因为在文件里面存储是不均匀的,如果随机读取就不可能得到一个完整的某一部分,每次都必须从头开始遍历字符,这是一个很明显的缺点。因为UTF-8没有一个同意的大小,GLib里面没有一个数据类型来特殊的表示UTF-8。但是,你可以用正常的gchar字符和字符串来表示(gchar *)UTF-8.
GLib中普遍使用Unicode标准的32位UCS- 4 gunichar类型。
以下函数针对单个的Unicode字符:
gboolean g_unichar_validate(gunichar c)
如果字符c是Unicode,返回真。
gboolean g_unichar_isdefined(gunichar c)
如果字符c是Unicode标准分配的,返回真。
gboolean g_unichar_isalnum(gunichar c)
如果字符c是字母或者数字,返回真。
gboolean g_unichar_islower(gunichar c)
如果字符c是小写字母,返回真。
gboolean g_unichar_isupper(gunichar c)
如果字符c是大写字母,返回真。
gboolean g_unichar_istitle(gunichar c)
如果字符c是标题字符(titlecase?)返回真。(ps:啥叫标题字符 贴devhelp解释来看,就不翻译了)
Determines if a character is titlecase. Some characters in Unicode which are composites, such as the DZ digraph have three case variants instead of just two. The titlecase form is used at the beginning of a word where only the first letter is capitalized. The titlecase form of the DZ digraph is U+01F2 LATIN CAPITAL LETTTER D WITH SMALL LETTER Z.
注意:
Titlecase doesn't appear much in English (or many other languages, for that matter). A titlecase letter is usually some sort of composite character or ligature where the first part of the composite goes to uppercase when the letter is capitalized at the start of a word. An example is the Lj in the Croatian word Ljubija.(估计用不上不翻译了)
gboolean g_unichar_isalpha(gunichar c)
如果字符c是一个字母,返回真。
gboolean g_unichar_isdigit(gunichar c)
如果字符c是一个十进制字符,返回真。
gboolean g_unichar_isxdigit(gunichar c)
如果字符c是一个十六进制字符,返回真。
gboolean g_unichar_ispunct(gunichar c)
如果字符c是某种符号或标点符号,返回真。
gboolean g_unichar_isspace(gunichar c)
如果字符c是一个空白的形式,包括空格,制表符和换行符。返回真。
gboolean g_unichar_iswide(gunichar c)
如果字符c通常需要两倍的一个正常的字符在屏幕上绘制的空间。返回真。
gboolean g_unichar_iscntrl(gunichar C)
如果字符c是一个Unicode控制字符。返回真。
gboolean g_unichar_isgraph(gunichar C)
如果你可以打印字符c,就是说如果它不是一个控制字符,格式字符,或空间。返回真。
gboolean g_unichar_isprint(gunichar c)
这个函数跟g_unichar_isgraph()很像,除了空格是返回的真。
如果你有一个gunichar的字符,而你想知道这个字符在Unicode是怎么分类的。你可以用:
g_unichar_type(c)
这个函数返回的一个常量(跟多信息在[TUC])
G_UNICODE_LOWERCASE_LETTER:小写字母
G_UNICODE_UPPERCASE_LETTER:大写字母
G_UNICODE_TITLECASE_LETTER:标题字符信
G_UNICODE_CONTROL:Unicode控制字符
G_UNICODE_FORMAT:使用Unicode格式字符
G_UNICODE_MODIFIER_LETTER:修饰符(看起来很奇怪的字母发音修改)
G_UNICODE_SURROGATE:两个16位表示一个字符的Unicode字符的复合
G_UNICODE_UNASSIGNED:目前未分配的字符
G_UNICODE_PRIVATE_USE:保留给私人,内部使用的字符
G_UNICODE_OTHER_LETTER:杂信
G_UNICODE_COMBINING_MARK:马克可能与另一个字母组合
G_UNICODE_ENCLOSING_MARK:马克,其中包含的另一封信
G_UNICODE_NON_SPACING_MARK:马克,通常需要没有空间来打印;上的立场取决于另一个基本字符
G_UNICODE_DECIMAL_NUMBER:数字
G_UNICODE_DECIMAL_LETTER_NUMBER:一个字母的数字
G_UNICODE_OTHER_NUMBER:任何其他的数字
G_UNICODE_CONNECTION_PUNCTUATION:绑定的标点符号
Dashlike G_UNICODE_DASH_PUNCTUATION:标点符号
G_UNICODE_OPEN_PUNCTUATION:开幕标点符号(如一个左括号)
G_UNICODE_CLOSE_PUNCTUATION:结束标点符号
G_UNICODE_INITIAL_PUNCTUATION:标点符号
G_UNICODE_FINAL_PUNCTUATION:终端标点符号
G_UNICODE_OTHER_PUNCTUATION:任何其他标点符号
G_UNICODE_CURRENCY_SYMBOL:货币货币符号
G_UNICODE_MODIFIER_SYMBOL:修饰符号(例如,一个口音)
G_UNICODE_MATH_SYMBOL:数学符号
G_UNICODE_OTHER_SYMBOL:任何其他奇怪的符号
G_UNICODE_LINE_SEPARATOR:换行符(例如,一个换行符)
G_UNICODE_PARAGRAPH_SEPARATOR:划分段落
G_UNICODE_SPACE_SEPARATOR:一个空的空间
下面是转换成单个gunichar字符的函数:
gunichar g_unichar_toupper(gunichar c)
返回字符c的大写字母,如果c已经是大写了,就不改变。
gunichar g_unichar_tolower(gunichar c)
返回c的小写字母。
gunichar g_unichar_totitle(gunichar c)
返回c的titlecase。
gint g_unichar_digit_value(gunichar c)
如果这个c是数字返回gint的数字,如果不是数字则返回-1.
gint g_unichar_xdigit_value(gunichar c)
跟上一个一样,不过返回的是十六进制。
现在你已经知道关于gunichar的很多有趣的事情,你可以会想知道你现在能对这种类型的能做什么事情了。大多数情况下,你必须冲UTF-8字符串中把Unicode字符给提取出来,在提取的过程没读取一个字符,你可能要对字符进行一定的有效性验证。
注意:你看到的函数里面,你可能会有一个带NULL结尾的字符串,但是这并不是一直必要的。如果一个函数需要gssize这种类型的参数,可以指定在UTF -8字符串函数应该处理的字节数。如果你要告诉一个函数来处理整个NULL结尾的字符串的大小就使用-1。(ps:窘,翻译的乱七八糟)
(1.4.4太长了 翻译起来 太有挫败感了。一下午就到这里。。。我现弄着后面比较上的把。。。窘。。。。而且感觉用的机会也不多)
2011年8月16日 23:04
我还一直以为UTF-8就是标准的Unicode,而且是定长2字节的,原来不是啊……
建议你翻译完吧,GTK+和Glib是完全使用UTF-8编码的。