关于程序输入(100)

  • 主题发起人 主题发起人 wangqinyun2000
  • 开始时间 开始时间
W

wangqinyun2000

Unregistered / Unconfirmed
GUEST, unregistred user!
SQL 简体程序开发在简体下完成客户端是繁体输入汉字时,如何处理保存到SQL 中要是简体字
 
以下转自CSDN,供你参考简繁转换的方法 简繁转换简单说可以有3种方法:API法、码表法、对照表法,扩展一下又可以及拆分,码表发可以分为文件码表和对照码表2种方式,还可以增加MLANG方法,当然这种方法用的相对很少,可能很多人根本就没有听说,下面可以一一列举。 1、API方法,这是Windows下开发最常用最简单的方法,利用Windows系统自带的API函数,寥寥数行代码即可完成,典型的例子就是Windows2000自带的例子,核心代码可以简单列一个 function GB2312ToBIG5(GB2312Str: string): AnsiString; var iLen: Integer; PGBCHSStr: PChar; //GB编码的简体字符 PGBCHTStr: PChar; //GB编码的繁体字符 PUnicodeChar: PWideChar; //Unicode编码的字符 PBIG5Str: PChar; //BIG5编码的字符 begin PGBCHSStr:=PChar(GB2312Str); iLen:=MultiByteToWideChar(936,0,PGBCHSStr,-1,nil,0); //计算转换的字符数 GetMem(PGBCHTStr,iLen*2+1); //分配内存 LCMapString($0804,LCMAP_TRADITIONAL_CHINESE,PGBCHSStr,-1,PGBCHTStr,iLen*2); //转换GB码简体到GB码繁体 GetMem(PUnicodeChar,iLen*2); //分配内存 MultiByteToWideChar(936,0,PGBCHTStr,-1,PUnicodeChar,iLen); //转换GB码到Unicode码 iLen:=WideCharToMultiByte(950,0,PUnicodeChar,-1,nil,0,nil,nil); GetMem(PBIG5Str,iLen); WideCharToMultiByte(950,0,PUnicodeChar,-1,PBIG5Str,iLen,nil,nil); Result:=string(PBIG5Str); FreeMem(PBIG5Str); FreeMem(PUnicodeChar); FreeMem(PGBCHTStr); end; 这是Delphi的方式,根据变量定义模式及开发工具不同,代码量会不同,但核心的就那几行 2、码表法有2种,一种是文件模式,一种是对照码表模式 文件模式 如果十年前你接触过软件开发,通过C语言调用UCDOS的字库显示汉字这招应该玩过,那么这个原理是一样的,条件是找一个合适的字库。该方法主要利用了gb-big5.tab或big5-gb.tab等码表文件进行,这种方式在网络开发及JAVA开发中用的特别多,核心代码也很简单 #define TABLE "gb-big5.tab" extern void usage(void); extern void convert(FILE *fp); void main(int argc,char **argv) { char *source; FILE *fp; if (argc!=2) usage(); source=argv[1]; setbuf(stdout,NULL); if (access(TABLE,4)!=0) usage(); if (source==NULL) usage(); if (strlen(source)==0) usage(); fp=fopen(source,"r"); if (fp==NULL) usage(); convert(fp); fclose(fp); fflush(stdout); fclose(stdout); } void convert(FILE *fp) { FILE *table; int c,x; long address; table=fopen(TABLE,"r"); do { c=fgetc(fp); if (c>=0xA0) { x=fgetc(fp); address=((c-0xA0)*510)+(x-1)*2; fseek(table,address,SEEK_SET); c=fgetc(table); x=fgetc(table); if (c!=0&&x!=0) fprintf(stdout,"%c%c",c,x); } else if (c!=EOF) fputc(c,stdout); } while (c!=EOF); fclose(table); } 对照码表 这种方法的原理是,把所有的汉字的内码通过变量或者一定的规则仔细定义好,然后据表查询即可,譬如“国”的简体内码是$B9FA,繁体内码是$B0EA,建立一个变脸表,一个存储所有简体汉字,一个存储所有繁体汉字,一一对应,马上就出来了 3、对照表法 对照表法应该是最实用最简单的简繁转换方式了,这个方法和对照码表方式差不多,区别在于对照码表法用内码,此方法直接用汉字显示, 同一个文件或不同文件里面存储简体和繁体的对照表,这个方法的最大好处是照顾行文习惯,这是所有国家化软件必须的方法,譬如 服务器 - 伺服器 文件 - 檔案 ...... 这种方式最大的麻烦是找一个好的对照表,很多公开代码的浏览器包括了这些,Linux下也包括了,当然一些好的对照表可以自己去维护 4、mlang方法 这种方法其实就是利用IE的API函数ConvertString,只是要自己定义而已,函数定义为 HRESULT ConvertString( DWORD *pdwMode, DWORD dwSrcEncoding, DWORD dwDstEncoding, BYTE *pSrcStr, UINT *pcSrcSize, BYTE *pDstStr, UINT *pcDstSize ); 具体可以去查MSDN 以上一共介绍了4种方法,细分来总共是5种方法。 还有一种方法就是利用标准Unicode码表去查,这个码表是MS制作的,也就形成了标准。这个是根据MS的GBK字库制作的 譬如“國”在简体码表库中的编码是$87F8,那么根据码表查出其Unicode码是$570B,然后根据Unicode码$570B到繁体码表库中查到繁体内码是$B0EA,问题就解决了,这个码表库可以到ftp://ftp.unicode.org/Public/MAPPINGS/去下载。936是简体,950是繁体 当然,还有更多分方法,譬如Access转换法,SQL转换法,但基本原理无外乎以上的几种方法。
 
本人想通过对照方式可从网上下载了这段代码:unit uFcpCVCode;interface function GBtoBIG5(value: string): string; function BIG5toGB(value: string): string; var BIG5Order: array[0..14757] of Word; GBOrder : array[0..22704] of Word; implementation function GBOffset(value: string): integer; begin if length(value) >= 2 then Result := (Ord(value[1]) - 161) * 94 + (Ord(value[2]) - 161) else Result := -1;end;function BIG5Offset(value: string): integer;begin Result := -1; if length(value) >= 2 then begin if (Ord(value[2]) >= 64) and (Ord(value[2]) <= 126) then Result := (Ord(value[1]) - 161) * 157 + (Ord(value[2]) - 64); if (Ord(value[2]) >= 161) and (Ord(value[2]) <= 254) then Result := (Ord(value[1]) - 161) * 157 + 63 + (Ord(value[2]) - 161); endend;function WordToString(value: Word): string;begin Result := Chr(Hi(value)) + Chr(Lo(Value));end;function isBIG5(value: string): Boolean;begin if (length(value)>=2) then begin if (value[1] < #161) then Result := false else if ((value[2] >= #64) and (value[2] <= #126)) or ((value[2] >= #161) and (value[2] <= #254)) then Result := true else Result := false end else Result := falseend;function isGB(value: string): Boolean;begin if (length(value)>=2) then begin if (value[1] <= #161) and (value[1] >= #247) then Result := false else if (value[2] <= #161) and (value[2] >= #254) then Result := false else Result := true end else Result := true;end;function GBtoBIG5(value: string): string;var leng, idx : integer; tmpStr : string[2]; Offset : integer; output : string;begin output := ''; leng := length(value); idx := 1; while idx <= leng do begin tmpStr := value[idx]+ value[idx + 1];if isGB(tmpStr) then begin offset:=GBOffset(tmpStr); if (offset >= 0) and (offset <= 8177) then begin output := output + WordToString(GBOrder[offset]); inc(idx); end else output := output + value[idx] ; end else output := output + value[idx] ; inc(idx, 1); end; Result := output;end;function BIG5toGB(value: string): string;var leng, idx : integer; tmpStr : string[2]; output : string; offset : integer;begin output := ''; leng := length(value); idx := 1; while idx <= leng do begin tmpStr := value[idx]+ value[idx + 1]; if isBIG5(tmpStr) then begin offset:=BIG5Offset(tmpStr); if (offset >= 0) and (offset <= 14757) then begin output := output + WordToString(BIG5Order[offset]); inc(idx); end else output := output + value[idx]; end else output := output + value[idx]; inc(idx); end; Result := output;end;initializationBIG5Order[0]:=$A1A1 ;BIG5Order[1]:=$A3AC;...在繁体下,可以通过GBtoBIG5把简体字转为繁体字 (测试通过)可输入的繁体字无法通过BIG5TOGB转为简体字保存到简体SQL那位高手指点一下!
 
http://hi.baidu.com/mjp1234airen4385/blog/item/9a40024bc17f592b08f7ef2c.html
 
to 草原骏马繁体转简体不行啊保存的数据还是繁体
 
程序必须内带转换表,否则2级字库无法用函数实现!转换表Google上有!
 
TO wql 程序中带了字库程序最后有:initializationBIG5Order[0]:=$A1A1 ;BIG5Order[1]:=$A3AC;...请高人指点啊!转换后与实际不符!
 
再加100分那位能帮我!繁体字通过BIG5TOGB 转为简体字如何存到数据库中啊,存的时候老是乱码
 
setbuf(stdout,NULL); if (access(TABLE,4)!=0) usage(); if (source==NULL) usage(); if (strlen(source)==0) usage(); fp=fopen(source,"r"); if (fp==NULL) usage(); convert(fp);
 
to jianghucpl,不太明白你上面的意思,能否解释一下
 
没办法加分本来还想给多个加个一百分!
 
后退
顶部