DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: ZMskyuza
今日帖子: 29
在线用户: 13
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 baby_moon (孤心明月) ★☆☆☆☆ -
普通会员
2023/3/13 17:59:46
标题:
有人遇到过ansi转utf8再转回来转不了的吗? 浏览:1453
加入我的收藏
楼主: ansitoutf8转完按字节分析是对的,但是utf8toansi转回来就是空串。用win API互转,转回ansi中间出现问号。有人遇到过吗?
----------------------------------------------
-
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2023/3/13 20:14:58
1楼: 代码扣出来再提问吧。
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/3/13 22:38:44
2楼: ANSI =  1 char = 1 byte 
UTF8 =  1 char = +1 byte (2, 3, 4...)

0..127  = ANSI = UTF8
128 ... = ANSI <> UTF8
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2023/3/13 22:47:44
3楼: AnsiEncode.GetString(UTF8Encode.GetBytes(AnsiStr))
----------------------------------------------
-
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2023/3/14 0:34:04
4楼: 是的,delphi ansistring 可以装任何字符(ansi/mbcs 等),某些字符在 utf8 转码过程中由于缺少本地(如中文 C_936.NLS 下)映射导致失败或丢失;如果要传递任意字符,建议 base64encode/decode
----------------------------------------------
-
作者:
男 baby_moon (孤心明月) ★☆☆☆☆ -
普通会员
2023/3/14 9:57:25
5楼: lsuper的回复可以接受。像这句话“201房间,段结刚司机,您执乘的31004次列车现已叫班请应答”转完就在“机,”出错,但是“201房间,段结刚司机,您执乘的31004次列车现已叫班请应答”转完就是对的,只是第二个标点换成了全角逗号。
有没有方法可以避免这种问题?
----------------------------------------------
-
作者:
男 kwer (★★★★★) ★☆☆☆☆ -
普通会员
2023/3/14 10:21:38
6楼: BUG的原因很有可能是出在delphi的string上面,用rawstring看看
----------------------------------------------
==========-==========-==========-==========-==========
     多隆, 给我备一匹最快的马, 我有事要走先~~~
==========-==========-==========-==========-==========
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2023/3/14 10:38:30
7楼: 为什么 无视 1楼?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 baby_moon (孤心明月) ★☆☆☆☆ -
普通会员
2023/3/14 14:57:23
8楼:   su := SO();
  su.S['text'] := AnsiToUtf8(S);
  if Debug then
  begin
    Log('test original     = ' + S);
    Log('original length   = ' + IntToStr(Length(S)));
    Log('test ansi to utf8 = ' + su.S['text']);
    Log('test utf8 to ansi = ' + Utf8ToAnsi(su.S['text']));
  end;

S是前面我发的那个字串

test original     = 201房间,段结刚司机,您执乘的31004次列车现已叫班请应答
original length   = 52
test ansi to utf8 = 201鎴块棿,娈电粨鍒氬徃鏈?鎮ㄦ墽涔樼殑31004娆″垪杞︾幇宸插彨鐝搴旂瓟
test utf8 to ansi = 201房间,段结刚司??您执乘的31004次列车现已叫班请应答

问题就在那两问号上
----------------------------------------------
-
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2023/3/14 21:28:14
9楼: 用 TEncoding 转试一试?
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
作者:
男 cnpack (CnPack) ★☆☆☆☆ -
普通会员
2023/3/14 22:10:10
10楼: 转UTF8后的内容最好用TBytes或RawByteString容纳,不要用AnsiString,否则UTF8中的内容被当做非法Ansi字符时有可能会破坏掉部分内容(出现问号),导致再转回就不准确了。
----------------------------------------------
欢迎使用CnPack IDE Wizards
http://www.cnpack.org/
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2023/3/14 22:14:06
10楼: 你这样的代码在Delphi 2009之前的版本应该行,但2009开始默认是unicode了,就不能这样用了。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 baby_moon (孤心明月) ★☆☆☆☆ -
普通会员
2023/3/15 9:24:40
11楼: 现在还在用Delphi7,维护20年的老项目

@cnpack 用了WinAPI的WideCharToMultiByte也出现问号,这个也是string的问题?
----------------------------------------------
-
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2023/3/15 10:27:27
12楼: https://www.cnblogs.com/zhiyewang/p/5209000.html
WCHAR *pwText =NULL;
char *pchUtf8=NULL;

整个json就S['text']行或者 其他类似的才是utf8也是不对的,虽然符号uft8 ansi通用保不齐出问题呢。
 su.S['text'] := 然后确认这个内存结构和下面的那里不对,是否换byte来接收?
AnsiToUtf8(S);先确认这个转出来内存结构对不对
我觉得你是要转完发送到api接口接收


你给的代码没说清楚我只能猜。
delphi版本 也没给全 咋调试?
我不记得delphi7有这个问题 印象中有个json库 有人提过中文?号问题。可能记错
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
男 flcop (flcop) ▲▲▲▲△ -
普通会员
2023/3/15 11:31:25
13楼: SO中的字符串是WideString(D2009开始是UnicodeString),Utf8也是一种AnsiString,AnsiToUtf8把LocalAnsi转成Utf8Ansi了,导致后面隐式转成WideString是用Utf8Ansi来转而不是LocalAnsi来转所以出错,其实给SO赋值可以不用转,或者也可以直接赋宽字符串:
var
  LUtf8Str: UTF8String;
  
su.S['text'] := S;  // LocalAnsi -> WideString
LUtf8Str := UTF8Encode(su.S['text']); // WideString -> UTF8
su.S['text'] := UTF8Decode(LUtf8Str); // UTF8 -> WideString 
S := su.S['text']; // WideString ->LocalAnsi
S := Utf8ToAnsi(LUtf8Str) // UTF8Ansi ->LocalAnsi
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2023/3/15 11:37:29
14楼: 10 楼 cnpack 的意思是对的。这种地方就不要用 string,用 Bytes 这样的字节序不容易出问题。
----------------------------------------------
-
作者:
男 baby_moon (孤心明月) ★☆☆☆☆ -
普通会员
2023/3/15 15:53:28
15楼: 感谢各位的跟贴,问题解决了,是superobject对象的问题。ansitoutf8的值传给su.S['text'],可能赋值的时候对象转了编码。最后放弃superobject生成json串,直接自己写,再转utf8就没问题了,服务端不再报错。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行46.875毫秒 RSS