第一部分:国际化
一什么是ID
简单的说,ID本质是一个整数,在不同的场合,具有不同的意义。主要是用来区分群体中的个体,即把群体中的某个个体,抽象成一个整数,在一定范围内使用和识别。
二LocalID
如何在世界的众多区域中标识本地区域呢?用LocalID,它是在语言的基础上抽象的一种标识。LocalID是由两个id拼接而成的,LanguageID和SortID。
DWORD MAKELCID(WORD lgid, WORD srtid)
三LanguageID
LanguageID也是由两个id拼接而成的,主id和子id。以简体中文为例,此外还要其他语言的主id,和台湾香港澳门等相关的子id。
WORD MAKELANGID(WORD priID, WORD subID)
#define LANG_CHINESE 0x04
#define SUBLANG_CHINESE_SIMPLIFIED 0x02
宏处理后,简体中文是0x804
四SortID
#define SORT_CHINESE_PRC 0x2 // PRC Chinese Stroke Count order
相关宏有:
MAKELCID
LANGIDFROMLCID
SORTIDFROMLCID
MAKELANGID
SUBLANGID
PRIMARYLANGID
LocalID、LanguageID、SorID的相关宏和预定义的值,请参阅包含在winnt.h,也可查阅MSDN。
第二部分:字符编码
一CharSet(字符集):
字符集(CharSet或者character repertoire)是一组抽象字符(abstract character)的集合,这里的字符是用来表达语义的符号。比如所有汉字构成的字符集,西欧语言字母构成的字符集,符号构成的字符集等。字符集的子集也为字符集,比如所有繁体字的集合。下面是一些字符集的ID,
#define ANSI_CHARSET 0 (ASCI)
#define GB2312_CHARSET 134 (中简GB2312)
#define CHINESEBIG5_CHARSET 136 (中繁BIG5)
#define SHIFTJIS_CHARSET 128 (日)
#define HANGUL_CHARSET 129 (韩)
此外还有阿拉伯、希腊等等。
二CodePage(代码页):
以简体中文为例子,为了计算机查找排序方便,给所有的简体中文和一些符号(按一定的规律和规则)映射一个整数表,表里面的每一个整数对应一个汉字或符号,这个表就是代码页。(这里的整数不约束于四个字节)。
具体的说,一个字节能表示的范围是0-127,而字符却成千上万个。由于字符个数大大多于一个字节能表示的范围,所以一般用多个字节表示一个字符。(这里的多个字节对应上段内容的整数,定义为“字节串”概念)
字符集和代码页不一定是一一对应的关系,字符集里面的字符和代码页中的整数也不一定是一一对应的。比如代码页A中可以对应字符集1的中文简体中文和字符集2的英文字母。而代码页B中可以对应所有的简体和繁体中文。
#define CP_ACP 0 // default to ANSI code page
#define CP_OEMCP 1 // default to OEM code page
#define CP_MACCP 2 // default to MAC code page
#define CP_THREAD_ACP 3 // current thread 's ANSI code page
#define CP_SYMBOL 42 // SYMBOL translations
#define CP_UTF7 65000 // UTF-7 translation
#define CP_UTF8 65001 // UTF-8 translation
可以在控制面板-区域和语言中查看自己电脑中安装的CodePage。
三什么是编码Encoding
说明CodePage的时候,所谓的“一定的规律和规则”就是编码。编码的结果就是代码页。
当前国际上最为通用的字符编码(商业规范)是Unicode编码。Unicode是由一个非赢利性组织“Unicode学术学会”建立和发展的涵盖世界大多数流行语言的字符编码形式。Unicode[现有的标准]版本为4.1,其中包含的所有语言符号(超过9万个,其中汉字为7万多)。
其他编码:GB2312, GB13000, GB18030, Unicode,UTF-8这些都是对字符集的编码(encoding)。其中常见对汉语字符集的编码包括GB2312-1980, GB13000, GBK, GB12345, GB18030—2000, Big5, Big5+, HKSCS, Big5+HKSCS, CNS 11643-1992等。UCS-2, UCS-4, UTF-32, UTF-16, UTF-8, UTF-EBCDIC和UTF-7都是Unicode编码的具体形式(即它们不是直接映射的字符,而是映射的Unicode码,其实也就对应字符啦)。
四多字节编码
由于字符个数大大多余一个字节能表示的范围,所以一般用多个字节表示一个字符。还以汉字为例子,一个汉字,在这个代码表中用1234表示,在另外一个代码表中可能用56789表示,如何转换呢?先把1234转换成一个标准的编码,然后由标准的编码转换成56789,
如此转换可以减少转换复杂度。这个“标准”就是上面提到的Unicode。同时用到了以下两个转换的window API:
MultiByteToWideChar(...)
WideCharToMultiByte(...)
五字体(Font)
知道“宋体”和“黑体”的区别,就不用解释字体的意义了。
要注意的是,字体不支持所有的字符。比如说宋体不会支持阿拉伯和梵文。所以要生成字体的时候,要选择字符集。字体里面存的是下笔拐弯和画直线等信息,对应的是文字符号。
六乱码的产生和消除
乱码产生的原因可能原因有:1代码页转换问题2没有应用合适的字体。大多数乱码出现是由于第一个原因,这里只介绍原因1。
还是拿汉字为例子。比如一个汉字,目前表示对应的是UTF-8编码中的12345。而默认的PageCode是GB2312。当显示汉字的时候,在GB2312中找12345对应的文字,肯定是错误的字或者乱码。如何正确显示呢?首先用MultiByteToWideChar函数把UTF-8编码转换成Unicode编码,再用WideCharToMultiByte函数把Unicode编码转换成GB2312的编码,然后显示才会正确。如下:
UTF-8 ---- 12345
Unicode ---- 55555
GB2312 ---- 98765
当显示的时候,在GB2312中找98765就会找到UTF-8中12345对应的汉字了。当然,用阿拉伯文字体或者梵文字体还是显示不出正确的字,还是找宋体吧 :)
分享到:
相关推荐
### 关于字符编码的转换知识 #### 一、引言 字符编码是在计算机科学领域内一个重要的基础概念,它涉及到如何在计算机系统中存储、处理和传输文本信息。随着信息技术的发展,不同地区和文化背景下的用户对字符的...
描述中提到的“国际化字符转码器”是一个应用程序,它提供了一种便捷的方式来进行字符编码的转换,无需额外安装,用户可以直接使用。这样的工具对于处理包含非ASCII字符的数据尤其有用,比如中文、日文、韩文等复杂...
根据压缩包中的文件名称“国际化字符转码.exe”,我们可以推测这是一个可执行程序,用户可以直接运行而无需安装,它提供了便捷的界面来帮助用户进行字符编码的转换操作。可能的功能包括选择输入文件,选择源编码和...
在VB(Visual Basic)编程中,处理字符编码是至关重要的,尤其是在进行进程间通信或者数据传输时。"VB转换字符编码(构造发送字符消息的准备工作)"这个标题涉及到的关键点是字符编码的转换以及如何为发送字符消息做好...
根据给定文件的信息,我们可以总结出以下关于“判断字符编码格式代码”的相关知识点: ### 一、背景介绍 在计算机科学领域,字符编码是将文本转换为数字表示的方法,以便于计算机存储和处理。常见的字符编码包括...
Java字符编码监听器是Java Web开发中的一个重要概念,主要用于处理HTTP请求和响应中的字符编码问题。在Java Servlet规范中,提供了`SetCharacterEncodingFilter`这样的过滤器,用于确保请求参数和响应内容的正确编码...
字符编码是计算机表示和处理文字的一种方式,它将各种字符与二进制数字对应起来。常见的字符编码有ASCII、GB2312、GBK、Big5、Unicode(包括UTF-8、UTF-16、UTF-32等)等。ASCII主要适用于英文,而GB2312、GBK和Big5...
HTML字符编码是网页开发中一个基础且重要的概念,它用于在HTML文档中插入特殊字符,因为某些字符...此外,虽然许多浏览器能够自动识别并正确显示未编码的特殊字符,但为了兼容性和标准化,最好始终使用适当的字符编码。
ISO 字符编码是国际标准化组织(ISO)制定的字符编码标准之一,它定义了一种基于 Unicode 的字符编码方式。ISO 字符编码 word 格示是指在 HTML 中使用 ISO 字符编码来表示特殊字符的方法。 ISO 字符编码的优点是它...
特别是在处理国际化和本地化项目时,正确的字符编码选择和转换策略可以避免乱码问题,确保信息的准确传递。因此,无论是开发者还是普通用户,对字符编码的理解都是现代信息技术中的基础技能之一。
字符集与字符编码是计算机处理文字的基础,它们决定了如何用二进制表示各种语言的字符。在信息技术领域,理解和掌握字符集与字符编码至关重要,因为它们直接影响到数据的存储、传输和显示。以下是对这些概念的详细...
在信息化时代,理解和掌握字符编码至关重要,尤其对于编程、数据交换以及国际化的文本处理。"完整版字符编码查看器"是一款实用工具,它可以帮助用户查看和理解各种字符编码格式,包括常见的ASCII、Unicode(如UTF-8...
了解HTTP头部字段的作用,以及如何在客户端和服务器端处理字符编码,对于开发国际化的Web应用至关重要。 通过本文的详细介绍,你应该对HTTP请求中的字符编码问题有了深入的理解,并掌握了处理这些问题的方法。如果...
首先,字符编码是一种规则,它定义了每个字符如何与数字(通常是整数)对应。例如,ASCII编码是最基础的字符集,包含了128个字符,包括英文字母、数字、标点符号和控制字符。随着全球化的发展,更复杂的编码如GBK...
### 解决字符编码的过滤器...总之,通过合理配置Servlet过滤器来解决字符编码问题是提高Web应用国际化能力的有效手段之一。开发者应该根据实际需求灵活调整编码策略,并结合前端技术共同保障数据传输的准确性与完整性。
- **简介**:Unicode是一种国际标准,旨在为世界上几乎所有的书写语言提供统一的字符编码方案,解决多语言环境下字符编码冲突的问题。 - **特点**:定义了超过10万种不同的字符,包括各种语言的字母、符号、表情等...
字符编码是计算机科学中的基础但又复杂的领域,其正确理解和应用对于避免乱码、实现国际化信息处理至关重要。无论是对于软件开发人员还是系统架构师,深入了解字符编码原理,掌握常见编码标准及其转换机制,都是提升...
字符编码是计算机处理文本的关键技术,它决定了计算机如何理解、存储和显示各种语言的字符。在信息技术领域,正确理解和使用字符编码至关重要,因为不同的编码方式适用于不同的语言环境和应用场景。"字符编码查询...