|
|
导航: |
论坛 -> 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
不行吗?
----------------------------------------------
-
|
作者: |
|
2010/9/21 18:08:06 |
1楼: |
Edit1.text 是 unicode, 但設定到 Tmp 被轉型為非 unicode (AnsiString) , 此時 Tmp 已不是 unicode 了, 再設到 Edit2.text 當然會有亂碼.
不知道您想問的重點是什麼?
----------------------------------------------
-
|
作者: |
|
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就是为了解决非中文环境下显示中文的乱码的问题,结果还是不行啊!有没有可以帮忙的朋友啊?帮帮在下吧!
----------------------------------------------
-
|
作者: |
|
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保存的中文信息吗?
----------------------------------------------
-
|
作者: |
|
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/
|
|