英文系统下面的中文字符显示乱码问题
wscft 2007-09-18 09:49:41 系统是 win XP professional 英文版本, 一个单元的 dbg_1:TTntDBGrid, 展示的数据的结果是从存储过程中返回的值,
dbg_1.Columns[0].title.Caption
dbg_1.Columns[1].title.Caption
...
要赋值的类型是 widestring 型的,
我这样写,为什么程序运行之后, 显示的总是乱码呢 ? 一个汉字对应一个? 就是没有转换过来啊, 如果付给英文的字符是可以正常显示的。
代码如下:
var
ls_wstring:widestring;
ls_wstring := '人数';
dbg_1.Columns[j].title.Caption := ls_wstring;
或者
dbg_1.Columns[j].title.Caption := StringToWideString('人数', 936);
调用两个转换函数如下:
{ Convert Variant to AnsiString }
function WideStringToString(const AValue: Variant; codePage: Word): AnsiString;
{Convert AnsiString to WideStirng }
function StringToWideString(const AValue: Variant; codePage: Word): WideString;
{中文 Unicode 码 转换为 AnsiString 时候, codePage 取 936 (cp_936) }
function WideStringToString(const AValue: Variant; codePage: Word): AnsiString;
var
l: integer;
ws:widestring;
begin
ws := VarToWideStr(AValue) ;
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;
{string码 转换为 WideString , codePage 取 936 (cp_936) }
function StringToWideString(const AValue: Variant; codePage: Word): WideString;
var
l: integer;
s: string;
begin
s := VarToStr(AValue);
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;