char数组转String,简体中文平台OK,繁体中文平台乱码,请大侠帮忙

马行空牛耕田 2007-04-22 07:44:41
环境:WinXP SP2 简体中文; WinXP SP2繁体中文(台湾),Delphi7.0
问题:在简体环境中,将char数组转成简体中文字串,没有问题;但是在繁体环境下,有部分乱码,乱码形式为问号,如
数组为:('N', 'g', #246, 'e', #27, 'g', ' ', #0, ' ', #0, ' ', #0, ' ', #0, ' ', #0, ' ', #0, ' ', #0, ' ', #0, ' ', #0, ' ', #0, ' ', #0, ' ', #0)
转换的结果为: 李?望

主要代码如下:

aName:array[0..29] of char;
...
FillChar(aName,30,0);
...
copymemory(@aname,@TmpCHMsg,30);
...
LName.Caption:=ConvertLang(WideCharLenToString(@aName,15));

主要使用WideCharLenToString对char数组进行转换,感觉因为数组里的char串本来就是简体ANSI,在简体平台上转自然没问题,但是到了繁体平台,默认语言不是简体,所以出了问题。
请帮忙诊断解决,万分感谢!


...全文
1826 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
马行空牛耕田 2007-04-26
  • 打赏
  • 举报
回复
ahjoe(强哥) 在线帮我解决了问题,在此贴出问题所在:
从读卡器读出的字串本身就是简体中文的unicode,在繁体平台转成对应的繁体自然某些字找不到,如果使用TntUnicode控件则可以正常显示简体中文!

当然,如果我希望的是在繁体平台上也显示对应的繁体,则需要将简体unicode通过对应表,找到对应的繁体unicode进而变成big5,从而在繁体平台正常显示! 那就是其他的问题了!

结贴!
ahjoe 2007-04-26
  • 打赏
  • 举报
回复
QQ 9001308.
ahjoe 2007-04-26
  • 打赏
  • 举报
回复
1. 为什么用 char数组,为什么不用string ?
2. 如果目标系统是繁体,编译前先把串转换成Big5编码的,当然在简体系统下编辑源码时看到的是乱码,在繁体系统下运行时就显示正常了。

工具 Big5GB.exe 用来转码
马行空牛耕田 2007-04-25
  • 打赏
  • 举报
回复
问题是我现在直接在Debug里看到的就是乱码,还没有到控件里去显示。

我是通过一个软件将简体工程转换成繁体工程的,表面上看各个控件的caption都是对应的繁体了,本身的charset我还没注意到!
马行空牛耕田 2007-04-25
  • 打赏
  • 举报
回复
谁愿意帮我解决问题,我可以给500分,只要CSDN不会认为我作弊,^_^!
最好是连线解决,我的QQ是15157587,可以远程协助,请高手指点,对于你们来说应该是小菜一碟!
马行空牛耕田 2007-04-24
  • 打赏
  • 举报
回复
帮帮我吧,谢谢了!
ygh1980 2007-04-24
  • 打赏
  • 举报
回复
在繁体系统进行简繁转化后,控件的字符集CHARSET 也要设置成CHINESEBIG5_CHARSET.
zuoansuifeng 2007-04-23
  • 打赏
  • 举报
回复
widestring
马行空牛耕田 2007-04-23
  • 打赏
  • 举报
回复
TO simb()
什么叫“全部都用宽字符”? 具体一点吧,我是Delphi菜鸟! 另外说明下,数据是用硬件读卡器从IC卡里面读出来的!
马行空牛耕田 2007-04-23
  • 打赏
  • 举报
回复
简体转为繁体的代码如下,来自网上,在简体平台上测试简体转繁体毫无问题,在繁体版本上,对程序中写死的简体中文转码也没问题:
function GBChs2Cht(GBStr : String): AnsiString;
{进行GBK简体转繁体}
var
Len: Integer;
pGBCHTChar: PChar;
pGBCHSChar: PChar;
begin
pGBCHSChar := PChar(GBStr);
Len := MultiByteToWideChar(936,0,pGBCHSChar,-1,nil,0);
GetMem(pGBCHTChar,Len*2+1);
ZeroMemory(pGBCHTChar,Len*2+1);
//GB CHS -> GB CHT
LCMapString($804,LCMAP_TRADITIONAL_CHINESE,pGBCHSChar,-1,pGBCHTChar,Len*2);
Result := String(pGBCHTChar);
FreeMem(pGBCHTChar);
//FreeMem(pGBCHSChar);
end;
马行空牛耕田 2007-04-23
  • 打赏
  • 举报
回复
我试过了,代码如下,但是还是乱码,不知道写得对否?

aName:array[0..29] of char;
s1 : WideString;
...
FillChar(aName,30,0);
...
s1 := aName;
此时出现的乱码如下:
'Ng鐹'#$1B'g '

该怎么使用呢? aName存的是简体字串,但是现在平台是繁体,怎么处理呢? 我试过用转码的API进行转换,但是仍然得到的是“李?望”! 郁闷
simb 2007-04-22
  • 打赏
  • 举报
回复
全部都用宽字符就好了阿

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧