DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: ahttp123
今日帖子: 22
在线用户: 17
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 vkow (vkow) ★☆☆☆☆ -
普通会员
2018/5/5 11:37:19
标题:
一个古老的UTF-8转码的问题,个别字符乱码如何解决? 浏览:1188
加入我的收藏
楼主: Delphi XE10版本下,其他的Delphi版本也遇到过类似问题。
现在想彻底解决这个问题。所以提出来问问大家有知道的么。

就是etANSI类型的字符串转码为etUTF8型的字符串。
只要是像 ',< 这种字符混在字符串中,用UTF8ToString转码,这个字符和前面的汉字就会转为乱码。

简单的再现方法:使用DropMaster 2.4.8版本,拖拽个UTF-8网页的链接。
打印一下就会看到。

效果如图片:
此帖子包含附件:
PNG 图像
大小:44.0K
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/5 20:18:14
1楼: 居然敢用 UTF8ToString 这胆子。

跨平台 字符串 讨论(以及 字符串编码 讨论)
http://2pascal.com/forum.php?mod=viewthread&tid=1654&fromuid=4
(出处: 2Pascal-新时代的Pascal)
----------------------------------------------
(C)(P)Flying Wang
作者:
男 vkow (vkow) ★☆☆☆☆ -
普通会员
2018/5/7 9:15:10
2楼: @wang_80919 (Flying Wang)

有处理字符串的经验么?

能否对具体方案指点一下。

我看了你发的链接,基本在讨论跨平台、数据传输中字符串的问题。

我把问题项目独立出来了。

大家看看能否搞定转换。编译项目,点击 test 按钮。就能再现问题。
此帖子包含附件:vkow_20185791510.zip 大小:6.1K
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/7 10:10:36
3楼: 楼主,准备好500万人民币再说。
不想看免费的文档,就准备好钱吧。

你的 DEMO 代码,给我5个亿,我都解决不了。
你都有 ? 号了。
基本上就是 转码 已经失败。是来源都已经是错误的内容了。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 jianlei (剑雷) ★☆☆☆☆ -
盒子活跃会员
2018/5/8 8:19:30
4楼: 我一般用TStringStream来转,效果好
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2018/5/8 8:55:30
5楼: 楼主,你的问题描述得不够清楚,用的什么控件?是UTF-8转UnicodeString,还是转AnsiString?
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2018/5/8 9:12:30
6楼: 楼主你的 TEST_UTF8 : String 定义只适用于Delphi2009之前的版本,在新版Delphi中,你应该用UTF8String类型。此外,貌似你的这个UTF8字符串本身就不对。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 vkow (vkow) ★☆☆☆☆ -
普通会员
2018/5/8 15:29:23
7楼: 问题解决了。
大体原因就是AnsiString转成WideString后,再转回AnsiString,在双字节和单字节上delphi处理的还是不够完善。
简单来说,就是一个AnsiString字符串转为WideString,再转回AnsiString后,两个字符串的bytes是不一样的。

具体到我代码里面,就是DropMaster在处理系统传过来的字符串是AnsiString。在事件中传递参数时,转成了String(默认为WideString)。之后,UTF8ToString就出现了上面的问题。

解决方法,就是修改DropMaster源码,要不就把参数明确为AnsiString,要不就是直接在源码里加入UTF8ToString。当然最好是明确参数。因为系统传递过来的字符串不一定需要UTF8转码。

最后,还是要谢谢兄弟们的帮忙。
----------
对了,前面发的那个测试Demo,大家没必要研究了。那个字符串本身就是有问题的。是经过AnsiString和WideString来回转换之后的。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/8 15:58:11
8楼: 狗屁,是太完善了,你 不会用。

1 楼的 网址,你眼瞎肯定看不见。
----------------------------------------------
(C)(P)Flying Wang
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行89.84375毫秒 RSS