我们通过接口传递webservice后,它返回信息为“涓婁紶鎴愬姛!” 
乱码的中文GBK解码utf-8字节码后的错乱形式,它的Utf-8形式的字节码16进制为:
00000000h: E4 B8 8A E4 BC A0 E6 88 90 E5 8A 9F 21     ; 涓婁紶鎴愬姛!..

复制代码

| 乱码字符 | GBK 编码 (十六进制) |
|----------|---------------------|
| 涓       | `E4 B8`             |
| 婁       | `8A E4`             |
| 紶       | `BC A0`             |
| 鎴       | `E6 88`             |
| 夽       | `90 E5`             |
| 姛       | `8A 9F`             |

复制代码

同样的还可以将这个16进制用UTF-8 格式每三个字节码显示一个中文:

E4 B8 8A → "上"
E4 BC A0 → "传"
E6 88 90 → "成"
E5 8A 9F → "功"
21       → "!"

所以我们要还原这个过程将GBK乱码反解成utf-8的原始字节,再将utf-8格式转成unicode,就能正确在VC中 messagebox了,不及格的程序员-八神

其实事情并不是这样的简单,首先它传回来时并不是以e4b88a 这种utf-8 原始码传回来的,现在我们看到的都是系统平台转换后的,后面我为了捕捉原始码上了代理软件截取了通信的二进制原始信息!它不仅可以返回成功信息,还可以返回错误信息
//下面为上传失败的返回错误信息

涓婁紶澶辫触锛佷紒涓氬敮涓�鏍囪瘑鐮侀獙璇佷笉閫氳繃锛�

//返回的乱码翻译过来:上传失败!企业唯?? 标识码验证不通过??, 正常脑补后修正实际应为"上传失败!企业唯一标识码验证不通过!"
下面我们来分析一下为什么没有正确解码

image

复制代码

现在拿出乱码部分 utf-16的 中文显示:涓婁紶澶辫触锛佷紒涓氬敮涓�鏍囪瘑鐮侀獙璇佷笉閫氳繃锛�
00000000h: 93 6D 41 5A 36 7D B6 6F AB 8F E6 89 1B 95 77 4F ; 搈AZ6}秓珡鎵.晈O
00000010h: 12 7D 93 6D 2C 6C 6E 65 93 6D FD FF CD 93 EA 56 ; .}搈,lne搈?蛽闢          //cd93 = 镙
00000020h: 11 76 2E 94 80 4F 59 73 87 74 77 4F 09 7B AB 95 ; .v.攢OYs噒wO.{珪
00000030h: 33 6C 43 7E 1B 95 FD FF                         ; 3lC~.朂          //FDFF = ?

然后 好巧不巧地 与 UTF-8 格式的 gbk式 解码 高度相似 ,中文为:上传失败!企业唯?? 标识码验证不通过?? 

00000000h: E4 B8 8A E4 BC A0 E5 A4 B1 E8 B4 A5 EF BC 81 E4 ; 涓婁紶澶辫触锛佷
00000010h: BC 81 E4 B8 9A E5 94 AF E4 B8 20 E6 A0 87 E8 AF ; 紒涓氬敮涓 鏍囪? //??(E4B820)标(e6a087)识(E8AF86)码(E7A081)
00000020h: 86 E7 A0 81 E9 AA 8C E8 AF 81 E4 B8 8D E9 80 9A ; 嗙爜楠岃瘉涓嶉€?
00000030h: E8 BF 87 EF BC 20                               ; 杩囷?

复制代码

通过以上对比,结论是 乱码的GBK编码的16进制就是它的 正确UTF-8格式的字节码,就是说将这些字节按utf-8格式解码就显示出正确的中文了

FDFF,是未能找到映射字符被充的空白占位符,未能被解析,也不能还原,原始码已丢失。 == UTF-8 : EF BF BD 

复制代码

HTTP/1.1 200
Server: nginx/1.26.2
Date: Thu, 23 Apr 2026 08:09:39 GMT
Content-Type: text/xml;charset=UTF-8
Transfer-Encoding: chunked
Connection: close

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><ns1:uploaddevicemanagesoldreturnrecordsResponse xmlns:ns1="DevManage"><ns1:out>&lt;?xml version="1.0" encoding="UTF-8"?>&lt;result>&lt;error>涓婁紶澶辫触锛佷紒涓氬敮涓 鏍囪瘑鐮侀獙璇佷笉閫氳繃锛 &lt;/error>&lt;/result></ns1:out></ns1:uploaddevicemanagesoldreturnrecordsResponse></soap:Body></soap:Envelope>

复制代码

我们可以看到它内存里返回的字符串信息 soap 包裹着乱码中文 e6 b6 93 就是涓 utf-8的表示

复制代码

0:000> x
*** WARNING: Unable to verify checksum for C:\WINDOWS\assembly\NativeImages_v4.0.30319_32\System\f291ffc218da543ab4e20e70929af20d\System.ni.dll
0019f358          this = 0x024d26fc
0019f354          request = 0x02631504
0019f350          res = 0x02664034
0019f34c          httpWebResponse = 0x02664034
0019f348          memoryStream = 0x02664370
0019f344          responseStream = 0x02663dc0
0019f340          buffer = 0x02664408
0019f33c          bytesRead = 0n517
0019f338          strUtf8 = 0x026656ec <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><ns1:uploaddevicemanagesoldreturnrecordsResponse xmlns:ns1="DevManage"><ns1:out>&lt;?xml version="1.0" encoding="UTF-8"?>&lt;result>&lt;error>涓婁紶澶辫触锛佷紒涓氬敮涓�鏍囪瘑鐮侀獙璇佷笉閫氳繃锛�&lt;/error>&lt;/result></ns1:out></ns1:uploaddevicemanagesoldreturnrecordsResponse></soap:Body></soap:Envelope>
0019f334          CS$1$0000 = 0x00000000
0019f330          CS$4$0001 = true

db 0x02664408 L1000

02664408  40 5c 70 6d 00 10 00 00-3c 73 6f 61 70 3a 45 6e  @\pm....<soap:En
02664418  76 65 6c 6f 70 65 20 78-6d 6c 6e 73 3a 73 6f 61  velope xmlns:soa
02664428  70 3d 22 68 74 74 70 3a-2f 2f 73 63 68 65 6d 61  p="http://schema
02664438  73 2e 78 6d 6c 73 6f 61-70 2e 6f 72 67 2f 73 6f  s.xmlsoap.org/so
02664448  61 70 2f 65 6e 76 65 6c-6f 70 65 2f 22 20 78 6d  ap/envelope/" xm
02664458  6c 6e 73 3a 78 73 64 3d-22 68 74 74 70 3a 2f 2f  lns:xsd="http://
02664468  77 77 77 2e 77 33 2e 6f-72 67 2f 32 30 30 31 2f  www.w3.org/2001/
02664478  58 4d 4c 53 63 68 65 6d-61 22 20 78 6d 6c 6e 73  XMLSchema" xmlns
02664488  3a 78 73 69 3d 22 68 74-74 70 3a 2f 2f 77 77 77  :xsi="http://www
02664498  2e 77 33 2e 6f 72 67 2f-32 30 30 31 2f 58 4d 4c  .w3.org/2001/XML
026644a8  53 63 68 65 6d 61 2d 69-6e 73 74 61 6e 63 65 22  Schema-instance"
026644b8  3e 3c 73 6f 61 70 3a 42-6f 64 79 3e 3c 6e 73 31  ><soap:Body><ns1
026644c8  3a 75 70 6c 6f 61 64 64-65 76 69 63 65 6d 61 6e  :uploaddeviceman
026644d8  61 67 65 73 6f 6c 64 72-65 74 75 72 6e 72 65 63  agesoldreturnrec
026644e8  6f 72 64 73 52 65 73 70-6f 6e 73 65 20 78 6d 6c  ordsResponse xml
026644f8  6e 73 3a 6e 73 31 3d 22-44 65 76 4d 61 6e 61 67  ns:ns1="DevManag
02664508  65 22 3e 3c 6e 73 31 3a-6f 75 74 3e 26 6c 74 3b  e"><ns1:out><
02664518  3f 78 6d 6c 20 76 65 72-73 69 6f 6e 3d 22 31 2e  ?xml version="1.
02664528  30 22 20 65 6e 63 6f 64-69 6e 67 3d 22 55 54 46  0" encoding="UTF
02664538  2d 38 22 3f 3e 26 6c 74-3b 72 65 73 75 6c 74 3e  -8"?><result>
02664548  26 6c 74 3b 65 72 72 6f-72 3e e6 b6 93 e5 a9 81  <error>......
02664558  e7 b4 b6 e6 be b6 e8 be-ab e8 a7 a6 e9 94 9b e4  ................
02664568  bd b7 e7 b4 92 e6 b6 93-e6 b0 ac e6 95 ae e6 b6  ................
02664578  93 ef bf bd e9 8f 8d e5-9b aa e7 98 91 e9 90 ae  ................
02664588  e4 be 80 e7 8d 99 e7 92-87 e4 bd b7 e7 ac 89 e9  ................
02664598  96 ab e6 b0 b3 e7 b9 83-e9 94 9b ef bf bd 26 6c  ..............&l
026645a8  74 3b 2f 65 72 72 6f 72-3e 26 6c 74 3b 2f 72 65  t;/error></re
026645b8  73 75 6c 74 3e 3c 2f 6e-73 31 3a 6f 75 74 3e 3c  sult></ns1:out><
026645c8  2f 6e 73 31 3a 75 70 6c-6f 61 64 64 65 76 69 63  /ns1:uploaddevic
026645d8  65 6d 61 6e 61 67 65 73-6f 6c 64 72 65 74 75 72  emanagesoldretur
026645e8  6e 72 65 63 6f 72 64 73-52 65 73 70 6f 6e 73 65  nrecordsResponse
026645f8  3e 3c 2f 73 6f 61 70 3a-42 6f 64 79 3e 3c 2f 73  ></soap:Body></s
02664608  6f 61 70 3a 45 6e 76 65-6c 6f 70 65 3e 00 00 00  oap:Envelope>

复制代码

我为了看着方便,简单对照了一下

UTF-8 涓:E6 B6 93,  GBK 涓: E4 B8
UTF-8 婁:E5 9A 81,  GBK 婁: 8A E4 
UTF-8 紶:E7 B4 B6, GBK 紶: BC A0 
UTF-8 上:E4 B8 8A  传:E4 BC A0

并用 wingate 通信代理截取通信内容是否为原始信息


 //不及格的程序员-八神

复制代码

00041860h: 55 54 46 2D 38 0D 0A 54 72 61 6E 73 66 65 72 2D ; UTF-8..Transfer-
00041870h: 45 6E 63 6F 64 69 6E 67 3A 20 63 68 75 6E 6B 65 ; Encoding: chunke
00041880h: 64 0D 0A 43 6F 6E 6E 65 63 74 69 6F 6E 3A 20 63 ; d..Connection: c
00041890h: 6C 6F 73 65 0D 0A 0D 0A 32 30 35 0D 0A 3C 73 6F ; lose....205..<so
000418a0h: 61 70 3A 45 6E 76 65 6C 6F 70 65 20 78 6D 6C 6E ; ap:Envelope xmln
000418b0h: 73 3A 73 6F 61 70 3D 22 68 74 74 70 3A 2F 2F 73 ; s:soap="http://s
000418c0h: 63 68 65 6D 61 73 2E 78 6D 6C 73 6F 61 70 2E 6F ; chemas.xmlsoap.o
000418d0h: 72 67 2F 73 6F 61 70 2F 65 6E 76 65 6C 6F 70 65 ; rg/soap/envelope
000418e0h: 2F 22 20 78 6D 6C 6E 73 3A 78 73 64 3D 22 68 74 ; /" xmlns:xsd="ht
000418f0h: 74 70 3A 2F 2F 77 77 77 2E 77 33 2E 6F 72 67 2F ; tp://www.w3.org/
00041900h: 32 30 30 31 2F 58 4D 4C 53 63 68 65 6D 61 22 20 ; 2001/XMLSchema" 
00041910h: 78 6D 6C 6E 73 3A 78 73 69 3D 22 68 74 74 70 3A ; xmlns:xsi="http:
00041920h: 2F 2F 77 77 77 2E 77 33 2E 6F 72 67 2F 32 30 30 ; //www.w3.org/200
00041930h: 31 2F 58 4D 4C 53 63 68 65 6D 61 2D 69 6E 73 74 ; 1/XMLSchema-inst
00041940h: 61 6E 63 65 22 3E 3C 73 6F 61 70 3A 42 6F 64 79 ; ance"><soap:Body
00041950h: 3E 3C 6E 73 31 3A 75 70 6C 6F 61 64 64 65 76 69 ; ><ns1:uploaddevi
00041960h: 63 65 6D 61 6E 61 67 65 73 6F 6C 64 72 65 74 75 ; cemanagesoldretu
00041970h: 72 6E 72 65 63 6F 72 64 73 52 65 73 70 6F 6E 73 ; rnrecordsRespons
00041980h: 65 20 78 6D 6C 6E 73 3A 6E 73 31 3D 22 44 65 76 ; e xmlns:ns1="Dev
00041990h: 4D 61 6E 61 67 65 22 3E 3C 6E 73 31 3A 6F 75 74 ; Manage"><ns1:out
000419a0h: 3E 26 6C 74 3B 3F 78 6D 6C 20 76 65 72 73 69 6F ; >&lt;?xml versio
000419b0h: 6E 3D 22 31 2E 30 22 20 65 6E 63 6F 64 69 6E 67 ; n="1.0" encoding
000419c0h: 3D 22 55 54 46 2D 38 22 3F 3E 26 6C 74 3B 72 65 ; ="UTF-8"?>&lt;re
000419d0h: 73 75 6C 74 3E 26 6C 74 3B 65 72 72 6F 72 3E E6 ; sult>&lt;error>?
000419e0h: B6 93 E5 A9 81 E7 B4 B6 E6 BE B6 E8 BE AB E8 A7 ; 稉濠佺炊婢惰精瑙
000419f0h: A6 E9 94 9B E4 BD B7 E7 B4 92 E6 B6 93 E6 B0 AC ; ﹂敍浣风磼娑撴艾
00041a00h: E6 95 AE E6 B6 93 EF BF BD E9 8F 8D E5 9B AA E7 ; 鏁稉锟介弽鍥
00041a10h: 98 91 E9 90 AE E4 BE 80 E7 8D 99 E7 92 87 E4 BD ; 槕閻線鐛欑拠浣
00041a20h: B7 E7 AC 89 E9 96 AB E6 B0 B3 E7 B9 83 E9 94 9B ; 风瑝闁俺绻冮敍
00041a30h: EF BF BD 26 6C 74 3B 2F 65 72 72 6F 72 3E 26 6C ; 锟?lt;/error>&l
00041a40h: 74 3B 2F 72 65 73 75 6C 74 3E 3C 2F 6E 73 31 3A ; t;/result></ns1:
00041a50h: 6F 75 74 3E 3C 2F 6E 73 31 3A 75 70 6C 6F 61 64 ; out></ns1:upload
00041a60h: 64 65 76 69 63 65 6D 61 6E 61 67 65 73 6F 6C 64 ; devicemanagesold
00041a70h: 72 65 74 75 72 6E 72 65 63 6F 72 64 73 52 65 73 ; returnrecordsRes
00041a80h: 70 6F 6E 73 65 3E 3C 2F 73 6F 61 70 3A 42 6F 64 ; ponse></soap:Bod
00041a90h: 79 3E 3C 2F 73 6F 61 70 3A 45 6E 76 65 6C 6F 70 ; y></soap:Envelop
00041aa0h: 65 3E                                           ; e>

HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.9044)
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Host: 222.185.127.216:7003
Content-Length: 609
Expect: 100-continue
Connection: Keep-Alive

复制代码

 到目前为止,我们认为它是 将utf-8的文字gbk编码了一次,又再utf-8的输出给客户端,当时我就想用java来还原这个过程,看看我猜的对不对
但是我是在android手机的java环境测试的 ,代码如下

结果并没有返回我期望的"上传失败!企业唯?? 标识码验证不通过??"
而是“上传失败!企业唯一标识码验证不通过�?” 


复制代码

package com.bosd.javatest;
..//忽略
public class MainActivity extends AppCompatActivity
{
    private AppBarConfiguration appBarConfiguration;
    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        setSupportActionBar(binding.toolbar);

        String correctMessage = null;
        try
        {
            correctMessage = "上传失败!企业唯一标识码验证不通过!";
        }
        catch (Exception e)
        {
        }
        System.out.println("1. 正确的原始消息: " + correctMessage);

        byte[] wrongGbkBytes = new byte[0]; // 获取正确的 UTF-8 字节
        try
        {
            wrongGbkBytes = correctMessage.getBytes("utf-8");
        }
        catch (UnsupportedEncodingException e)
        {
            throw new RuntimeException(e);
        }
        System.out.println("Original UTF-8 Hex");
        printHex(wrongGbkBytes);
        String corruptedString = null;
        try
        {
            corruptedString = new String(wrongGbkBytes,"GBK");
            System.out.println("After GBK Encode Utf-8 Hex");
            printHex(corruptedString.getBytes("gbk"));
        }
        catch (Exception e)
        {
        }
        System.out.println("2. 服务端错误解读后产生的乱码字符串: " + corruptedString);

        byte[] finalBytesSent = new byte[0];
        try
        {
            finalBytesSent = corruptedString.getBytes("utf-8");
        }
        catch (UnsupportedEncodingException e)
        {
            throw new RuntimeException(e);
        }
        System.out.println("3. 最终发送给客户端的 UTF-8 字节 (十六进制): ");
        printHex(finalBytesSent);

        String whatClientSees = null;
        try
        {
            whatClientSees = new String(finalBytesSent, "utf-8");
        }
        catch (UnsupportedEncodingException e)
        {
            throw new RuntimeException(e);
        }
        System.out.println("4. 客户端最终看到的内容: " + whatClientSees);

更多推荐