论坛信息
最新加入:
l_hx
今日帖子:
5
在线用户:
1
导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2023/3/13 17:59:46
标题:
有人遇到过ansi转utf8再转回来转不了的吗?
浏览:446
加入我的收藏
楼主:
ansitoutf8转完按字节分析是对的,但是utf8toansi转回来就是空串。用win API互转,转回ansi中间出现问号。有人遇到过吗?
----------------------------------------------
-
作者:
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/
作者:
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
作者:
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
----------------------------------------------
-
作者:
2023/3/14 9:57:25
5楼:
lsuper的回复可以接受。像这句话“201房间,段结刚司机,您执乘的31004次列车现已叫班请应答”转完就在“机,”出错,但是“201房间,段结刚司机,您执乘的31004次列车现已叫班请应答”转完就是对的,只是第二个标点换成了全角逗号。 有没有方法可以避免这种问题?
----------------------------------------------
-
作者:
kwer (★★★★★)
★☆☆☆☆
-
普通会员
2023/3/14 10:21:38
6楼:
BUG的原因很有可能是出在delphi的string上面,用rawstring看看
----------------------------------------------
==========-==========-==========-==========-========== 多隆, 给我备一匹最快的马, 我有事要走先~~~ ==========-==========-==========-==========-==========
作者:
2023/3/14 10:38:30
7楼:
为什么 无视 1楼?
----------------------------------------------
(C)(P)Flying Wang
作者:
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次列车现已叫班请应答 问题就在那两问号上
----------------------------------------------
-
作者:
2023/3/14 21:28:14
9楼:
用 TEncoding 转试一试?
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
作者:
2023/3/14 22:10:10
10楼:
转UTF8后的内容最好用TBytes或RawByteString容纳,不要用AnsiString,否则UTF8中的内容被当做非法Ansi字符时有可能会破坏掉部分内容(出现问号),导致再转回就不准确了。
----------------------------------------------
欢迎使用CnPack IDE Wizards http://www.cnpack.org/
作者:
2023/3/14 22:14:06
10楼:
你这样的代码在Delphi 2009之前的版本应该行,但2009开始默认是unicode了,就不能这样用了。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
2023/3/15 9:24:40
11楼:
现在还在用Delphi7,维护20年的老项目 @cnpack 用了WinAPI的WideCharToMultiByte也出现问号,这个也是string的问题?
----------------------------------------------
-
作者:
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
----------------------------------------------
-
作者:
2023/3/15 11:37:29
14楼:
10 楼 cnpack 的意思是对的。这种地方就不要用 string,用 Bytes 这样的字节序不容易出问题。
----------------------------------------------
-
作者:
2023/3/15 15:53:28
15楼:
感谢各位的跟贴,问题解决了,是superobject对象的问题。ansitoutf8的值传给su.S['text'],可能赋值的时候对象转了编码。最后放弃superobject生成json串,直接自己写,再转utf8就没问题了,服务端不再报错。
----------------------------------------------
-