在之前也写过一些关于apns的事情,不过都没有深究。都是抄抄改改,写写弄弄,近日 在与人讨论时,人说纯中文可以发76个汉字左右。当时我就想了,这不应该啊。apns总长度不能超过256字节,76个汉字。json_encode一下。一个汉字8个字节,早就超了不知道多少了。还要组成payload。。难道不超吗?
然后看了一下别人的函数,原来是用了一个自定义的json_encode。看了他的自定义json_encode之后,突然想起,风雪之隅在他的博客上提到过,5.4的json_encode加了一些参数(参考: 让Json更懂中文(JSON_UNESCAPED_UNICODE)),于是看了一下。json_encode($str,JSON_UNESCAPED_UNICODE)。计算下来的长度与那个自定义的json_encode一样了。
自此,记录下来。推送的时候也可以多推几个汉字了。(仅限php5.4,之前的版本还是网上找自定义的json_encode函数吧,关键字:中文自定义 php json_encode ,或者直接看:http://yige.org/p/458)
早期关于APNS的文章 :
在实际中遇到了标题的问题,即:
type ttt struct{}
var t ttt;
与
t := New(ttt)
有什么区别?
包括手册上都说好象没啥区别( 我记得好象是《go 云动力》)
但是我在测试jsonrpc的时候,用 var t ttt的方式 时:
XML/HTML代码
- 2013/05/31 12:46:35 rpc.Register: type Arith has no exported methods of suitable type (hint: pass a pointer to value of that type)
换成t:=New(ttt),就OK了
------
新手,暂时不知其所以然,先记录和备份一下
在使用golang做数据传输的时候,会经常遇到byte与int的互转,但golang并没有现成的方法,因此只能通过binary包来解决
所以,需要 :import "encoding/binary",又因为是byte的转换,所以还涉及到了bytes:import "bytes"
代码如下:
XML/HTML代码
- package main
-
- import (
- "bytes"
- "encoding/binary"
- "fmt"
- "strings"
- )
-
- func main() {
- b := []byte{0x00, 0x00, 0x03, 0xe8}
- b_buf := bytes.NewBuffer(b)
- var x int32
- binary.Read(b_buf, binary.BigEndian, &x)
- fmt.Println(x)
-
- fmt.Println(strings.Repeat("-", 100))
-
- x = 1000
- b_buf = bytes.NewBuffer([]byte{})
- binary.Write(b_buf, binary.BigEndian, x)
- fmt.Println(b_buf.Bytes())
- }
基本上就这么解决了。其实下面不赋值x也无所谓。因为本来就是1000
golang的Json处理还算是比较方便的吧?
比如:json.Marshal就完成了处理。
OK,开始说事儿:
1、
var s = make(map[string]interface{})
s["userid"] = "123"
s["time"] = "12345"
result , _ = json.Marshal(s);
println(string(result))
这时候你会发现,打印出来的json数据。。。time居然在前面。。。map没有顺序,果然是这样的。
那怎么把userid放在最前面呢?
2、type JsonData struct{
UserId string `json:"userid"`
Time string `json:"time"`
}
j := JsonData{UserId:"123",Time:"12345"}
result,_ = json.Marshal(j);
println(result);
这时候出来的才是按顺序的json数据
这两种情况根据需要写吧。其实我自己是比较偏向于第一种,json要顺序干嘛。不过有些程序写的比较硬编码,不是按JSON解析的话,就只能用第二种,定义标准的输出了。。
再加上之前我也记录过,json.Marshal,只针对struct中的首字符大写的KEY进行encode,小写直接就忽略,所以还必须得写上tag。好痛苦的事情啊