|
大牛们拿去研究看能应用上不能,节省时间出成绩啊,呵呵# T: L U! U/ q$ K0 C' x
/ g5 o3 n8 F/ M: X4 `' q$ p) t: c* P
& j% X2 K0 Y# }$ `, t6 c: I
unicode到gbk的转换程序6 t7 ^* u! W5 p2 A2 b
unsigned char Unicode_to_GBK(unsigned char *ch) ) Q8 L: S6 p. I! U' F" h, f
{ ) o" w9 o. v2 H1 N9 B
unsigned int temp;
, z, ~5 Q w5 t' ? unsigned int sector_offset;//扇区偏移
& w) W. {6 M9 W: z3 d unsigned int byte_offset;//字节偏移 4 j, {4 ]2 j7 {3 k
unsigned char buffer[512];
: p/ G D' o7 S' t temp = *((unsigned int*)ch);//由于FAT中文件民unicode码是 地字节在前,所以要按uint型读 * W7 l! P* w, {" N
temp -= 0x4e00;//减去基础数据
. ]! m5 M V7 [ temp *= 2;//每个汉字两个字节 $ q$ B# I6 D# e! Z( p4 p
sector_offset = temp/BytesPerSector;//计算出扇区偏移,确定存在哪个扇区
0 h% K% ?4 w3 U0 \ byte_offset = temp%BytesPerSector;//存在哪个字节 ' \3 t% T/ K8 T$ V2 W ]
if(FAT_ReadSector(UNI2GBK + sector_offset,buffer))return 1;//读那个扇区 ! T. K0 @7 B) c& F# d$ k# v6 a
*ch = buffer[byte_offset];//将数据读出 # _' v( S: i8 R; k
*(ch+1) = buffer[byte_offset+1];
5 l9 y9 ]/ M M, y8 X) \, } return 0;
: _: i) p. t$ U2 x& \} 8 \; }7 u+ Z( @& b7 c2 c" z/ X- x" z
要注意的是FAT中文件名的存放方式是低字节在前,而gbk的存放是高字节在前,操作时不要搞混了。
3 Z) j( W* r1 q. e4 Q) r/ |1 ~: ~$ i; b7 o3 T& b. s2 f
; C9 B0 g% S7 a$ @7 R
$ c) B$ h/ o- t6 u
) B0 T! ?0 Q/ s4 P; z+ U$ T附件1是两个字库
8 u: N' X9 I' D; o9 t% H
1 W% |3 i+ H$ H5 T& Q$ r; h+ ~4 z+ m
. P6 f% D* E# L4 D3 }: x3 q两者之间的转化这能通过查表,两者没有对应关系。所以要建一张unicode-2312的对照表。
9 U9 B- r% ]6 E, W# \当然如过想节省程序运行时间,要建两张表,分别按照各自的线性关系放,这样就免去查找的所耗的时间了。但是这样字库就会变大。我觉得用空间去换取速度可行。
- \) M. `/ S0 A& l W+ u' |( b5 z+ S
附件2是两个转换好的码表" l4 U" Y5 O, i' b
$ k$ u, U' Z. h+ k+ f2 _; y
uni2gbk.sys为unicode转gbk的表,从unicode的0x4e00 到0x9fa5 顺序存放着相应的gbk码,总共20902个汉字,对应的文件是41804Bytes
. Q7 ]5 M7 V4 N% u/ N; [注:由于没有找到一些符号的unicode对照表,因此这张表中只包含了汉字部分。因此不能显示诸如“”()等符号,程序中要做相应处理。 . z' t: H4 U" J2 |
注文件存放方式是高字节在前 比如0x4e00 存放方式为0x4e 0x00 n4 h( b- N% j& D2 H: B0 q
- r! a3 i. P5 T; s! W: @gbk2uni.sys为gbk转unicode的表,从gbk的0x8140 到0xfeff 即126*192 = 24192按照gbk的编码顺序放,为了线形查找,其中不合法的或根据资料没有相应unicode码的都作了填零处理。文件大小为48384Bytes
! f. @( J, s+ _* p注文件存放方式是高字节在前 比如0x4e00 存放方式为0x4e 0x00 |
评分
-
查看全部评分
|