一、语言处理
人类的语言其实主要有两大类,一类是表音的,一类是表形的。而随着语言的发展,又出现了表意的(非专业人士,表述可能有点不专业)。一般来说,表意的文字多是从表形发展来的。而随着人类社会的发展,计算机技术的出现,就必然解决人机交互中的文字输入问题。
而计算机技术是从欧美等表音文字世界出现的,所以必然是处理表音文字的输入也就是大家常见的字母和单词的处理。计算机技术一开始大家也没想到会如此的改变了世界,所以其实是有很多的问题存在的,语言的处理仅仅是其中的一个(不知道大家有没有千年虫的概念)。
但随着计算机技术的影响越来越大,谁也无法忽视其它语言特别是中文的输入的问题。
二、对中文的支持
其实对计算机来说,支持哪种语言并不是一种问题,问题是能不能在原有的技术框架内解决问题。由于一开始表音文字易于被计算机处理,而未考虑中文(包括类似的东亚及其它语言)的表述,所以在有一段时间,又掀起了一番计算机要淘汰中文的言论。不过随着五笔输入等一系列的输入法的出现,彻底打破了这一系列的叫嚣。
所谓语言的处理,其实就是如何用存储单元来映射文字也就是编码。如果每个字符都分配有一个唯一的二进制编码,那么只要输入这个编码,不就可以在屏幕上显示文字了么。对英语来说,二十六个字母,一个字母对应一个键,那么一个字符就可以轻松应对,这也就是常见的ASCII编码。学过计算机原理的可能都知道,后面又出现了解决中文等的Unicode编码,其中有大家常见的UTF-8、UTF-16和UTF-32。
而有了这些,大家在开发使用一些软件时,就不会经常出现界面上的文字的乱码。当然,即使有,如果处理不当,仍然会出现乱码的现象。不过,这比以前好多了。
针对中文的处理,我国制定了相关的国家标准GB(Guojia Biaozhun,国家标准)系列编码,包括 GB2312、GBK和GB18030。大家可以这样理解,GB2312是基础版,GBK是增强版而GB18030是全面支持版。
三、C++提供的支持及开发工具和库
C++对于中文的支持其实也相当多,这其中包括语言本身的支持和相关工具的支持以及库的支持,下面分别说明。
-
C++本身的支持
其实C++本身不是针对中文而是对Unidcode编码的支持,其中包括宽字符(wchar_t)和多字节字符(mbs函数系列);另外在C++17中提供了字符编码转换的接口(不过codecvt已经标记弃用),而在早期的一些平台中,如Windows中也提供了类似的不同编码字符间的转换。 -
库的支持
库的支持包括STL库的支持和第三方库的支持,主要有:
STL库的支持:locale本地库,std::locale类提供了本地化相关内容的支持如日期、时间以及货币等。
第三方库的支持:常见的如Boost库等都提供了字符编码转换的相关接口如Boost.Locale。另外还有一些具体到的公司中为自己的产品开发的相关的中文支持库等。 -
工具的支持
这个最常见的就是Qt了,其实它也算是第三方库,其相关的Qt库中提供了各种对UTF-8或UNICODE字符编码的支持,如QTextCodec类。另外一些常见的GUI库中都提供了对中文的支持,如wxWidgets、FLTK等。当然,输入法当仁不让的是首先的中文输入工具,这类工具太多了,这里就不一一举例了。
其实,对中文处理除了有输入还有保存、显示等等,甚至在通信(如网络、串口等)、分析等中都有广泛的应用。这都需要一系列的中文相关的基础的支持,最典型的就是字体库,一个好的字体库往往能让显示的中文更漂亮,更容易处理排版等效果。
四、总结
可以说这一篇文章是较为务虚的说明,而不是具体的C++处理语言的实践分析。希望以后有时间再把相关的具体内容进行详细分析说明。先从整体上有一个语言处理的轮廓就会更容易的切入到具体的技术问题。

1743





