在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Windows系统上的 Notepad.exe 打开文件后,点击“文件”菜单中的“另存为”命令,会跳出一个对话框,在最底部有一个“编码”的下拉条。 缺省的编译选项下,编译器认为String就是AnsiString字符串(可以使用$H编译开关来进行修改)。 可以将一个WideString赋给一个AnsiString,也可以将一个AnsiString赋给一个WideString,在赋值过程中将发生编码转换,如果一个WideString中的Unicode字符在ANSI字符集编码范围之外,则该Unicode字符被转为? (0x3F),所以就会出现拷贝一些阿拉伯字符串到文本框中后变成一串?的情况。 Unicode编码则是采用双字节16位来进行编号,可编65536字符,基本上包含了世界上所有的语言字符,它也就成为了全世界一种通用的编码,而且用十六进制4位表示一个编码,非常简结直观,为大多数开发者所接受。
WideString由WideChar字符组成,而不是由AnsiChar字符组成的,它们跟Unicode字符串兼容。 Utf8String的定义同string, 但一般存放Utf8编码的字符串。 UTF-8编码 1.字符编码的发展 其中0-31:是控制字符或通讯专用字符(不可以显示的字符,其余为可显示字符),如控制符:LF(换行)、CR(回车)等。 32-126:是字符,其中32是空格。 48-57为0-9的阿拉伯数字。 65-90为26个大写英文字母。 97-122为26个小写英文字母。 其余的是一些标点符号,运算符号等。 ASSCII共计有128个,从0到127,也就是从00000000-01111111,最高位都是0。 第二阶段:ANSI编码(本地化)阶段,ASCII只能表示英文字符,那么其他字符怎么表示呢?汉语是这样解决的,用两个ASCII表示一个汉字,而且不用前面的128个。比如汉字“中”在中文操作系统中使用[0xD6,0xD0] 这两个字节存储,这样每个汉字也都有了自己的编码,汉字编码解决了,这就是中国的GB2312编码标准,但是这是中国汉字的编码,那么其他国家呢?其他的国家的计算机操作系统中可能把[0xD6,0xD0] 这两个字节存储成他们的文字,而不是“中”,不同的国家和地区制定了不同的标准,这些使用 2 个字节来代表一个字符的各种文字延伸编码方式,称为 ANSI 编码。 (1)GB2312-80汉字编码 GB2312国标字符集构成一个二维平面,它分成94行、94列,行号称为区号,列号称为位号。每一个汉字或符号在码表中都有各自的位置,字符的位置用它所在的区号(行号)及位号(列号)来表示。每个汉字的区号和位号分别用1个字节来表示, 如:“大”字的区号20,位号83,区位码是20,83 用2个字节表示为:00010100 01010011 问题:信息通信中,汉字的区位码与通信使用的控制码(00H~1FH)发生冲突。 解决方案:为避免汉字区位码与通信控制码冲突,ISO2022规定,每个汉字区号和位号必须分别加上32(即20H), 即区位码加上2020H。 经过这样处理得到的代码称为汉字的“国标交换码”(简称交换码)。因此,“大”字的国际交换码是: 区位码(00010100 01010011)+ 2020H=国际交换码(00110100 01110011) 机内码: 问题:文本中汉字与西文字符经常混用,汉字信息如不予以特别的标识,它与单字节的标准ASCII码就会混淆不清。 解决方法:把一个汉字看作两个扩展ASCII码,使表示GB2312汉字的两个字节的最高位(b7)加“1”,(即27=128=80H)。这种高位为l的双字节(16位)汉字编码就称为GB2312汉字的“机内码”,又称内码。 第三阶段:UNICODE(国际化),为了使国际间信息交流更加方便,国际组织制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。 Unicode目前普遍采用的是UCS-2它用两个字节来编码一个字符一般用十六进制来表示UCS-2最多能编码65536个字符
环境:win7中文旗舰版 + VS2010 + 当前代码页为GBK(GBK兼容GB2312,所以上面的例子,可以再当前环境下验证)
string str1 = "123大";//GBK编码[31H,32H,33H,b4H,f3H] 1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。 2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。 例如: “大”字,UCS-2编码为[5927H],即[0101 1001 0010 0111] 对于UTF-8编码来说,[5927H]在0800H~FFFFH之间,应该使用[1110 xxxx 10yy yyyy 10zz zzzz],将[0101 1001 0010 0111]以此填入xxxx yy yyyy zz zzzz部分,得 [1110 0101 1010 0100 1010 0111],即 [e5H a4H a7H]
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论