|
大牛们拿去研究看能应用上不能,节省时间出成绩啊,呵呵! B8 d& R7 U' U9 X; Y2 p+ C
; P) `- Y: z8 x* ^) q! V+ `* G- B* {2 w0 m
unicode到gbk的转换程序1 U% l: E: i/ q* l
unsigned char Unicode_to_GBK(unsigned char *ch)
( k+ o; P: J. I, ~; b& Z6 G/ n{
0 V, Z/ ~& h$ @4 j8 K unsigned int temp; + S$ V! S1 Q4 I! j, n( O. C
unsigned int sector_offset;//扇区偏移 3 g/ J( E* P& k: @! @1 \6 i
unsigned int byte_offset;//字节偏移
4 d; y1 V; Y/ N3 M! A, e) P unsigned char buffer[512]; ) Y7 Z/ `9 ^7 h' N5 |. B
temp = *((unsigned int*)ch);//由于FAT中文件民unicode码是 地字节在前,所以要按uint型读
: ]" y+ F6 t% I/ x/ P* F temp -= 0x4e00;//减去基础数据 7 L9 u3 T6 q8 y* |8 f4 ?; v( Z6 @
temp *= 2;//每个汉字两个字节
$ I+ E# Z1 m# o: Q! I* k sector_offset = temp/BytesPerSector;//计算出扇区偏移,确定存在哪个扇区
, f( U9 {; @4 R; a3 l byte_offset = temp%BytesPerSector;//存在哪个字节 ! n' C7 `. ]- c3 N. s. P! J8 f
if(FAT_ReadSector(UNI2GBK + sector_offset,buffer))return 1;//读那个扇区
3 C& }7 I& c |/ T, B, N *ch = buffer[byte_offset];//将数据读出 8 o: `8 Y# Z+ q* E
*(ch+1) = buffer[byte_offset+1]; * [- m+ R+ _ C2 H5 x
return 0; & A! C5 ?9 T' ]; N- z
} 7 _) Y: L, Q/ H
要注意的是FAT中文件名的存放方式是低字节在前,而gbk的存放是高字节在前,操作时不要搞混了。 - W4 z& m3 j. j: v! H, k
/ E# E' p! U! f( N$ X. U, R! U
9 J! a8 K; O# J! E6 X7 k! W" C; p5 V$ h: y! a
7 x8 h2 H! r' D% J; z; C# W) l
附件1是两个字库
} a9 ^ q4 I f
6 y2 T7 |/ L, y# e9 m+ m: L4 ^0 v: A" J, z
两者之间的转化这能通过查表,两者没有对应关系。所以要建一张unicode-2312的对照表。 * ^! \6 S$ Q, X2 u; W
当然如过想节省程序运行时间,要建两张表,分别按照各自的线性关系放,这样就免去查找的所耗的时间了。但是这样字库就会变大。我觉得用空间去换取速度可行。
+ F7 Q4 }# S+ Z; [7 a' L/ t# A. u/ a. [
附件2是两个转换好的码表6 J& O: ~% a+ H/ j2 O
7 m# I: L: R3 n8 T8 h0 B k# k% guni2gbk.sys为unicode转gbk的表,从unicode的0x4e00 到0x9fa5 顺序存放着相应的gbk码,总共20902个汉字,对应的文件是41804Bytes
6 f" v! U9 X0 V5 j4 |) R5 d5 E l注:由于没有找到一些符号的unicode对照表,因此这张表中只包含了汉字部分。因此不能显示诸如“”()等符号,程序中要做相应处理。
5 q3 a4 L+ i+ E2 l, c# y4 |注文件存放方式是高字节在前 比如0x4e00 存放方式为0x4e 0x00 : D' d9 r2 p( P1 ~/ F
9 s+ g" P. ~/ N) M5 I9 M
gbk2uni.sys为gbk转unicode的表,从gbk的0x8140 到0xfeff 即126*192 = 24192按照gbk的编码顺序放,为了线形查找,其中不合法的或根据资料没有相应unicode码的都作了填零处理。文件大小为48384Bytes 6 I4 a" M; N9 v6 ~" ]( C
注文件存放方式是高字节在前 比如0x4e00 存放方式为0x4e 0x00 |
评分
-
查看全部评分
|