DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: xieqiongxi1
今日帖子: 0
在线用户: 1
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 chjk (ChJK) ★☆☆☆☆ -
盒子活跃会员
2010/9/21 17:07:56
标题:
紧急求救,D2010下有关string和ansistring的问题 浏览:2232
加入我的收藏
楼主: 用D2010建立一个工程,程序窗口放一个button两个edit,按钮事件如下:
procedure TForm1.Button1Click(Sender: TObject);
var
  Tmp: AnsiString;
begin
  Tmp:= AnsiString(Edit1.Text);
  Edit2.Text:=string(Tmp);
end;
在英文机子上的XP或Win7,Edit2不能享受Unicode的待遇显示的是乱码,请问高手怎么解决啊?
----------------------------------------------
-
作者:
男 ivvn (奔腾的心) ★☆☆☆☆ -
普通会员
2010/9/21 18:07:15
1楼: 你搞那么复杂干什么啊

Edit2.Text:=Edit1.Text

不行吗?
----------------------------------------------
-
作者:
男 mainchen_ (mainchen) ★☆☆☆☆ -
普通会员
2010/9/21 18:08:06
1楼: Edit1.text 是 unicode, 但設定到 Tmp 被轉型為非 unicode (AnsiString) , 此時 Tmp 已不是 unicode 了, 再設到 Edit2.text 當然會有亂碼.

不知道您想問的重點是什麼?
----------------------------------------------
-
作者:
男 rad_studio_xe (rad_studio_xe) ★☆☆☆☆ -
普通会员
2010/9/21 19:37:55
2楼: edit1.text,edit2.text都是unicode,,换转换个蛋啊
----------------------------------------------
-
作者:
男 chjk (ChJK) ★☆☆☆☆ -
盒子活跃会员
2010/9/21 21:18:12
3楼: 其实我就是想问AnsiString如何再转换回UnicodeString,我已经吧Edit2.text:=String(Temp);强制类型转换成UnicodeString了,但是不起作用啊,但是强制转成Anstring却管用,这是为什么?
----------------------------------------------
-
作者:
男 egust (欢迎访问 Delphi@smth.org) ★☆☆☆☆ -
普通会员
2010/9/21 22:19:44
4楼: unicode 字符向本地编码转换时有可能丢失信息。像 unicode 字符集的中文字符在 locale 设置为英文的 windows 系统中转换为默认编码的 ANSI 字符串时,由于本地字符集不包括中文字符编码,因而无法转换的字符将被转为无法正常显示的字符;再转回 unicode 后,自然就是一堆不知道什么东西了。
要是“ANSI”能包办所有字符,那还要 unicode 干嘛?
----------------------------------------------
cnblogs中我写的关于Delphi的blog,欢迎访问:
http://www.cnblogs.com/egust/
作者:
男 chjk (ChJK) ★☆☆☆☆ -
盒子活跃会员
2010/9/21 23:57:37
5楼: 楼上的兄弟你的意思就是不能将Ansi在恢复回Unicode编码了,那小弟可就完了,以前D7下的数据是加密存储到数据库的,那时的数据都是AnsiString,如果用D2010的话将以前加密的数据解密后也不能转成Unicode了,结果就是乱码了,小弟之所以用D2010就是为了解决非中文环境下显示中文的乱码的问题,结果还是不行啊!有没有可以帮忙的朋友啊?帮帮在下吧!
----------------------------------------------
-
作者:
男 mainchen_ (mainchen) ★☆☆☆☆ -
普通会员
2010/9/22 5:01:46
6楼: 將它轉成 utf8 即可,例:

procedure TForm1.Button1Click(Sender: TObject);
var
  Tmp: AnsiString;
begin
  Tmp:= UTF8Encode(Edit1.Text);
  Edit2.Text:=UTF8Decode(Tmp);
end;
----------------------------------------------
-
作者:
男 chjk (ChJK) ★☆☆☆☆ -
盒子活跃会员
2010/9/22 7:58:39
7楼: 但这样可以兼容我以前用D7用Ansi保存的中文信息吗?
----------------------------------------------
-
作者:
男 mainchen_ (mainchen) ★☆☆☆☆ -
普通会员
2010/9/22 8:13:23
8楼: 可以!
----------------------------------------------
-
作者:
男 egust (欢迎访问 Delphi@smth.org) ★☆☆☆☆ -
普通会员
2010/9/22 9:37:35
9楼: 不存在“ANSI”这种编码或字符集,而 unicode 字符集是明确的,该字符集可以有 UTF-16 BE/LE、UTF-32 BE/LE、UTF-8、UTF-7 等等编码。Delphi 中的 AnsiString 正常情况下是用的本地机设定的字符集,也就是使用本地机指定使用的 locale 的编码与该编码包含的字符集。你过去的数据不存在“都是AnsiString”,而是符合 GBK 编码的字符串(八成你是在简体中文 windows 使用的并且也没改变 locale 设定)。同样,当在运行在 x86 平台上的 windows 中使用 D2009+ 的 UnicodeString 时,实际上用的是 UTF-16 LE 编码的字符串。而当你的程序运行于 locale 设定非简体中文的机器上时,正常情况下它的“AnsiString”就不会使用 GBK 编码。

所以楼上完全是瞎出主意,UTF-8 和 GBK 完全是两个不同的编码,光变成 AnsiString 什么用都没有。

兼容你过去的数据的办法不难,只要在程序里把字符串转换为 GBK 编码再计算就可以了。但是这样也带来了另一个问题,就是当 GBK 编码包括的字符集不完全包括当地语言使用的字符时(例如韩文),你的这个向过去兼容的机制会导致无法正确处理,而你的程序也失去了使用 unicode 带来的好处。
所以,你过去的程序在国际化方面从骨子里就有问题,而“非中文环境下显示中文的乱码”仅仅是显示出来的最明显的问题,而不是问题的全部。

别怪我说风凉话,作为一个要做国际化软件的程序员,了解一下关于字符集与编码的知识一点儿都不过分吧?这些东西本身一点儿都不复杂,而且都是有十多年历史的东西了,到现在还搞不清楚,活该出问题。上中文 wiki 看一看 unicode/UTF-16/UTF-8/GBK/Big5/EASCII,再看一下 win 提供的那两个转换字符集的 API,花上用不了小半天的时间什么都明白了。再加上 D2010 里也增加了字符串类型的语法支持(string(CodePage)),完全是只要了解原理就够了,根本不需要知道细节。
----------------------------------------------
cnblogs中我写的关于Delphi的blog,欢迎访问:
http://www.cnblogs.com/egust/
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行49.80469毫秒 RSS