我用delphi6写一个数据库管理软件,数据库用SQL server 2000,操作系统是XP sp2,出现一个很奇怪的问题,当我使用存储过程向数据库写数据时,若字符串中带有中文汉字字符,那么写到数据库中的时候SQL会将后面的N个字符截断(字符串长度并未越界),不管是纯中文字符串还是中英文混合,后面无论全是英文还是中英混合,都发生这种情况。
小弟是没在WINXP灌过SQL, 因为习惯用WIN2K,所以没遇过你所说的问题, 但若是UINCODE问题,UNICODE2与UINOCODE8, 那么只需将资料转换 上面那一微软的网址不是说: 在 Windows NT 或 Windows 2000 上,可以使用 Win32 函数 MultiByteToWideChar 及 WideCharToMultiByte,将常数 CP_UTF8 (65001) 当作函数的第一个参数来传递,以将 UTF-8 转换到 UCS-2 或从 UCS-2 转换到 UTF-8。
那么在WINXP应也是相同的方式
function UnicodeEncode(Str:string;CodePage:integer):WideString; var Len:integer; begin Len:=Length(Str)+1; SetLength(Result,Len); Len:=MultiByteToWideChar(CodePage,0,PChar(Str),-1,PWideChar(Result),Len); SetLength(Result,Len-1); //end is #0 end;
function UnicodeDecode(Str:WideString;CodePage:integer):string; var Len:integer; begin Len:=Length(Str)*2+1; //one for #0 SetLength(Result,Len); Len:=WideCharToMultiByte(CodePage,0,PWideChar(Str),-1,PChar(Result),Len,nil,nil); SetLength(Result,Len-1); end;
function Gb2Big5(Str:string):string; begin SetLength(Result,Length(Str)); LCMapString(GetUserDefaultLCID,LCMAP_TRADITIONAL_CHINESE, PChar(Str),Length(Str), PChar(Result),Length(Result)); Result:=UnicodeDecode(UnicodeEncode(Result,936),950); //Result:=UnicodeEncode(Result,936); end;
function Big52Gb(Str:string):string; begin Str:=UnicodeDecode(UnicodeEncode(Str,950),936); SetLength(Result,Length(Str)); LCMapString(GetUserDefaultLCID,LCMAP_SIMPLIFIED_CHINESE, PChar(Str),Length(Str), PChar(Result),Length(Result)); end;
//unicode 专用字串转换函数 function WideStringToString(const ws: WideString; codePage: Word): AnsiString; var l: integer; begin if ws ='' then Result :='' else begin l := WideCharToMultiByte(codePage, WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR, @ws[1], - 1, nil, 0, nil, nil); SetLength(Result, l - 1); if l > 1 then WideCharToMultiByte(codePage, WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR, @ws[1], - 1, @Result[1], l - 1, nil, nil); end; end; { WideStringToString }
{:Converts Ansi string to Unicode string using specified code page. @param s Ansi string. @param codePage Code page to be used in conversion. @returns Converted wide string. } function StringToWideString(const s: AnsiString; codePage: Word): WideString; var l: integer; begin if s ='' then Result :='' else begin l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PChar(@s[1]), - 1, nil, 0); SetLength(Result, l - 1); if l > 1 then MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PChar(@s[1]), - 1, PWideChar(@Result[1]), l - 1); end; end; { StringToWideString }
//GetWinDir是自定义函数,起功能是找出Windows\System\的路径. function GetWinDir: String; var Buf: array[0..MAX_PATH] of char; begin GetSystemDirectory(Buf, MAX_PATH); Result := Buf; if Result[Length(Result)]<>'\' then Result := Result + '\'; end;
----------------------------------------------
to be ,not to be, is life! until now, I still study life....