github.com/rolandhe/saber@v0.0.4/jcomp/README.md (about) 1 # 与java兼容的字符串处理 2 ## jstring 3 golang的string底层是utf8,而java是utf16, 二者的len不同,substring也不同。由于java的utf16可以包含大部分的中文字符,所以基于java string的length已经实现了大量业务,因此golang需要兼容java的行为,保证二者的一致性。 4 jstring提供如下能力: 5 * JavaStringLen, 返回和java String.Length兼容的长度 6 * JavaSubString, 实现Java String.substring(int start, int end)语义 7 * JavaSubStringToEnd, 实现Java String.substring(int start)语义 8 * JavaToChars, 实现Java Character.toChars(int codepoint)语义 9 * JavaCharCount,实现Java Character.charCount(int codepoint)语义 10 * JavaCodePoint/JavaCodePointAt/JavaCodePoint, 把[]Char转成codepoint 11 12 13 ### CodePoint和Char 14 codepoint是unicode的概念,任何一个字符在unicode体系中都有对应的一个table 行的位置,这个位置用数字表示,就是codepoint,它用一个32bit int来描述,但到目前为止仅仅使用了24bit。codepoint在golang中用rune来描述。 15 在java中每个codepoint用一个或2个char来描述,最多两个。每个char对应0~65535, 这和golang的uint16正好相对应。 16 17 所以jstring声明了CodePoint和Char类型,他们分别是rune和uint16的别名。 18 19 ### 示例 20 21 ``` 22 func javaLength(){ 23 s := "刘德华 andi lou" 24 l, _ := jcomp.JavaStringLen(s) 25 26 fmt.Println(l, len(s)) 27 } 28 ```