关于编码格式的一点思考

        最近在工作中,用到了组装json串,并发送给服务器端。在本机模拟了客户端和服务端。 
        首先的问题是json串在网络中以什么格式发送?
        
        将这个问题分解为2个问题:
        1)json串编码为什么类型数据发送?  整个json串本质上以字符串发送,看下面的列子就可以很清晰的
         理解。比如我们需要组装发送以下字符串:
           {
               "encoding" : "UTF-8",
       "Tag" : "people",
       "age": 3,
       "height": 1.03
        "name" : "JOR",
           }
           
           在代码中初始化字符串如下:
         QString  strjson ( "{"
              " \"encoding\" : \"UTF-8\","
           "  \"Tag\" : \"people\","
              "  \"age\": 3,"
              "  \"height\": 1.03 "
             "  \"name\" : \"JOR\", "
            " }" )
            
            也就是 本质上 无论xml 或json 串,我们均以字符类型编码后发送(这个需要与json或xml串中的 类型加以区分:
            如 “age”:3。 这里的3被json定义为int类型,其实质是从使用角度告诉json使用者,将这个当做 int 类型加以解析。
            很多json开源库本质上执行了string("3").toint的转换。



 2)json字符串以什么编码格式发送?
 这里涉及到另外一个概念:我们能够看到的字符,最终是以一种编码格式存储在计算中,因为计算机只识别0,1。 我们能             够看到 的字符,必然是以某种数字编码存储在计算中。 以中文“湖”字来举例,在Windows下各种不同编码格式所对应的编码值如下:

  FF FE  56 6E   : UNICODE 编码,其中FF FE 为文件头
          FE FF  6E 56   : unicode bigendian 编码,其中FE FF 为文件头
          E6 B9 96       : utf-8   编码
          EF BB BF E6 B9 96  :utf-8 with bom  其中 EF BB BF 为文件头
   BA FE : ASCII编码


          因此我们编码规定下json字符串的各位为utf-8,并且告知服务器,以utf-8格式的方式解析收到的字节流
          
          
       下面来看看具体的实际列子:
         {
         "encoding" : "UTF-8",
      "Tag" : "people",
      "age": 3,
      "height": 1.03
        "name" : "JOR",
      "addr" :  "湖北"
       }
       
       首先来看看以utf-8编码方案,该字符串的内容:
                        20 20 7B 0D 0A 20 20 20  20 20 20 20 20 20 22 65
6E 63 6F 64 69 6E 67 22  20 3A 20 22 55 54 46 2D
38 22 2C 0D 0A 09 20 22  54 61 67 22 20 3A 20 22
70 65 6F 70 6C 65 22 2C  0D 0A 20 20 20 20 20 20
09 20 22 61 67 65 22 3A  20 33 2C 0D 0A 20 20 20
20 20 20 09 20 22 68 65  69 67 68 74 22 3A 20 31
2E 30 33 0D 0A 20 20 20  20 20 20 20 09 20 22 6E
61 6D 65 22 20 3A 20 22  4A 4F 52 22 2C 0D 0A 09
20 22 61 64 64 72 22 20  3A 20 20 22 E6 B9 96 E5
8C 97 22 0D 0A 20 20 20  7D 0D 0A 

将其读入内存中看其对于关系:

  1.    直接将json串存放在以utf-8编码的的文本文中,将其读入内存,其内存对应关系如下(和上面的一致,忽略空格换行符等)
表达式
m_deciveToHost_RequsetData "  {\n         "encoding" : "UTF-8",\n\t "Tag" : "people",\n      \t "age": 3,\n      \t "height": 1.03\n       \t "name" : "JOR",\n\t "addr" :  "?1\226?\214\227"\n   }\n" QByteArray
[0] 32 ' ' char
[1] 32 ' ' char
[2] 123 '{' char
[3] 10 '\n' char
[4] 32 ' ' char
[5] 32 ' ' char
[6] 32 ' ' char
[7] 32 ' ' char
[8] 32 ' ' char
[9] 32 ' ' char
[10] 32 ' ' char
[11] 32 ' ' char
[12] 32 ' ' char
[13] 34 '"' char
[14] 101 'e' char
[15] 110 'n' char
[16] 99 'c' char
[17] 111 'o' char
[18] 100 'd' char
[19] 105 'i' char
[20] 110 'n' char
[21] 103 'g' char
[22] 34 '"' char
[23] 32 ' ' char
[24] 58 ':' char
[25] 32 ' ' char
[26] 34 '"' char
[27] 85 'U' char
[28] 84 'T' char
[29] 70 'F' char
[30] 45 '-' char
[31] 56 '8' char
[32] 34 '"' char
[33] 44 ',' char
[34] 10 '\n' char
[35] 9 '\t' char
[36] 32 ' ' char
[37] 34 '"' char
[38] 84 'T' char
[39] 97 'a' char
[40] 103 'g' char
[41] 34 '"' char
[42] 32 ' ' char
[43] 58 ':' char
[44] 32 ' ' char
[45] 34 '"' char
[46] 112 'p' char
[47] 101 'e' char
[48] 111 'o' char
[49] 112 'p' char
[50] 108 'l' char
[51] 101 'e' char
[52] 34 '"' char
[53] 44 ',' char
[54] 10 '\n' char
[55] 32 ' ' char
[56] 32 ' ' char
[57] 32 ' ' char
[58] 32 ' ' char
[59] 32 ' ' char
[60] 32 ' ' char
[61] 9 '\t' char
[62] 32 ' ' char
[63] 34 '"' char
[64] 97 'a' char
[65] 103 'g' char
[66] 101 'e' char
[67] 34 '"' char
[68] 58 ':' char
[69] 32 ' ' char
[70] 51 '3' char
[71] 44 ',' char
[72] 10 '\n' char
[73] 32 ' ' char
[74] 32 ' ' char
[75] 32 ' ' char
[76] 32 ' ' char
[77] 32 ' ' char
[78] 32 ' ' char
[79] 9 '\t' char
[80] 32 ' ' char
[81] 34 '"' char
[82] 104 'h' char
[83] 101 'e' char
[84] 105 'i' char
[85] 103 'g' char
[86] 104 'h' char
[87] 116 't' char
[88] 34 '"' char
[89] 58 ':' char
[90] 32 ' ' char
[91] 49 '1' char
[92] 46 '.' char
[93] 48 '0' char
[94] 51 '3' char
[95] 10 '\n' char
[96] 32 ' ' char
[97] 32 ' ' char
[98] 32 ' ' char
[99] 32 ' ' char
[100] 32 ' ' char
[101] 32 ' ' char
[102] 32 ' ' char
[103] 9 '\t' char
[104] 32 ' ' char
[105] 34 '"' char
[106] 110 'n' char
[107] 97 'a' char
[108] 109 'm' char
[109] 101 'e' char
[110] 34 '"' char
[111] 32 ' ' char
[112] 58 ':' char
[113] 32 ' ' char
[114] 34 '"' char
[115] 74 'J' char
[116] 79 'O' char
[117] 82 'R' char
[118] 34 '"' char
[119] 44 ',' char
[120] 10 '\n' char
[121] 9 '\t' char
[122] 32 ' ' char
[123] 34 '"' char
[124] 97 'a' char
[125] 100 'd' char
[126] 100 'd' char
[127] 114 'r' char
[128] 34 '"' char
[129] 32 ' ' char
[130] 58 ':' char
[131] 32 ' ' char
[132] 32 ' ' char
[133] 34 '"' char
[134] -26 / 230 char
[135] -71 / 185 char
[136] -106 / 150 char
[137] -27 / 229 char
[138] -116 / 140 char
[139] -105 / 151 char
[140] 34 '"' char
[141] 10 '\n' char
[142] 32 ' ' char
[143] 32 ' ' char
[144] 32 ' ' char
[145] 125 '}' char
[146] 10 '\n' char

2.  采用第三方开源库qjson,其字符与内存的对应关系如下:
  bytejsonTest "{\n "Tag" : "people",\n "addr" : "\u6e56\u5317",\n "age" : 3,\n "encoding" : "utf-8",\n "height" : 1.03,\n "name" : "JOR"\n}" QByteArray
[0] 123 '{' char
[1] 10 '\n' char
[2] 32 ' ' char
[3] 34 '"' char
[4] 84 'T' char
[5] 97 'a' char
[6] 103 'g' char
[7] 34 '"' char
[8] 32 ' ' char
[9] 58 ':' char
[10] 32 ' ' char
[11] 34 '"' char
[12] 112 'p' char
[13] 101 'e' char
[14] 111 'o' char
[15] 112 'p' char
[16] 108 'l' char
[17] 101 'e' char
[18] 34 '"' char
[19] 44 ',' char
[20] 10 '\n' char
[21] 32 ' ' char
[22] 34 '"' char
[23] 97 'a' char
[24] 100 'd' char
[25] 100 'd' char
[26] 114 'r' char
[27] 34 '"' char
[28] 32 ' ' char
[29] 58 ':' char
[30] 32 ' ' char
[31] 34 '"' char
[32] 92 '\' char
[33] 117 'u' char
[34] 54 '6' char
[35] 101 'e' char
[36] 53 '5' char
[37] 54 '6' char
[38] 92 '\' char
[39] 117 'u' char
[40] 53 '5' char
[41] 51 '3' char
[42] 49 '1' char
[43] 55 '7' char
[44] 34 '"' char
[45] 44 ',' char
[46] 10 '\n' char
[47] 32 ' ' char
[48] 34 '"' char
[49] 97 'a' char
[50] 103 'g' char
[51] 101 'e' char
[52] 34 '"' char
[53] 32 ' ' char
[54] 58 ':' char
[55] 32 ' ' char
[56] 51 '3' char
[57] 44 ',' char
[58] 10 '\n' char
[59] 32 ' ' char
[60] 34 '"' char
[61] 101 'e' char
[62] 110 'n' char
[63] 99 'c' char
[64] 111 'o' char
[65] 100 'd' char
[66] 105 'i' char
[67] 110 'n' char
[68] 103 'g' char
[69] 34 '"' char
[70] 32 ' ' char
[71] 58 ':' char
[72] 32 ' ' char
[73] 34 '"' char
[74] 117 'u' char
[75] 116 't' char
[76] 102 'f' char
[77] 45 '-' char
[78] 56 '8' char
[79] 34 '"' char
[80] 44 ',' char
[81] 10 '\n' char
[82] 32 ' ' char
[83] 34 '"' char
[84] 104 'h' char
[85] 101 'e' char
[86] 105 'i' char
[87] 103 'g' char
[88] 104 'h' char
[89] 116 't' char
[90] 34 '"' char
[91] 32 ' ' char
[92] 58 ':' char
[93] 32 ' ' char
[94] 49 '1' char
[95] 46 '.' char
[96] 48 '0' char
[97] 51 '3' char
[98] 44 ',' char
[99] 10 '\n' char
[100] 32 ' ' char
[101] 34 '"' char
[102] 110 'n' char
[103] 97 'a' char
[104] 109 'm' char
[105] 101 'e' char
[106] 34 '"' char
[107] 32 ' ' char
[108] 58 ':' char
[109] 32 ' ' char
[110] 34 '"' char
[111] 74 'J' char
[112] 79 'O' char
[113] 82 'R' char
[114] 34 '"' char
[115] 10 '\n' char
[116] 125 '}' char


发现了以下区别:  对于 中文字符“湖北”:


采用直接读取utft-8格式文件;得到的编码为:
   [133] 34 '"' char
[134] -26 / 230 char
[135] -71 / 185 char
[136] -106 / 150 char
[137] -27 / 229 char
[138] -116 / 140 char
[139] -105 / 151 char
[140] 34 '"' char

采用第三方开源软件qjson,得到的编码如下:


   [31] 34 '"' char
[32] 92 '\' char
[33] 117 'u' char
[34] 54 '6' char
[35] 101 'e' char
[36] 53 '5' char
[37] 54 '6' char
[38] 92 '\' char
[39] 117 'u' char
[40] 53 '5' char
[41] 51 '3' char
[42] 49 '1' char
[43] 55 '7' char
[44] 34 '"' char

qjson 默认就是把非 ASCII 字符以外转义为 Unicode。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值