go中的库/包处理字符串编码?

时间:2016-07-16 03:21:55

标签: go

是否有任何类似的库/包可以模拟vis(3)unvis(3)对BSD系统的作用?我试图做一些需要表示包含特殊字符(如空格等)的字符串的东西。

1 个答案:

答案 0 :(得分:0)

不,不完全是,但如果您正在寻找网址编码,您可以使用net/url包进行所需的所有网址编码:
见:Encode / decode URLs
并且:Is there any example and usage of url.QueryEscape ? for golang

示例代码:

fmt.Println(url.QueryEscape("https://stackoverflow.com/questions/tagged/go test\r \r\n"))

输出:

http%3A%2F%2Fstackoverflow.com%2Fquestions%2Ftagged%2Fgo+test%0D+%0D%0A

或自己编写:

Go字符串中的

UTF-8编码的,实际上是一个只读的字节切片:
你可能得到这样的字节:

str := "UTF-8"
bytes := []byte(str)    //   string to slice
fmt.Println(str, bytes) // UTF8 [85 84 70 45 56]

或将字节转换为字符串,如下所示:

s := string([]byte{85, 84, 70, 45, 56, 32, 0xc2, 0xb5}) // slice to string
fmt.Println(s)                                          // UTF-8 µ

0xC2 0xB5是字符' MICRO SIGN'的UTF-8(十六进制) (U + 00B5)见:http://www.fileformat.info/info/unicode/char/00b5/index.htm

你也可以得到这样的字节:

for i := 0; i < len(s); i++ {
    fmt.Printf("%d: %d, ", i, s[i])
    //0: 85, 1: 84, 2: 70, 3: 45, 4: 56, 5: 32, 6: 194, 7: 181,
}

或紧凑的十六进制格式:

fmt.Printf("% x\n", s) // 55 54 46 2d 38 20 c2 b5

并获得符文(Unicode代码点),如下所示:

for i, v := range s {
    fmt.Printf("%d: %v, ", i, v)
    //0: 85, 1: 84, 2: 70, 3: 45, 4: 56, 5: 32, 6: 181, 
}

请参阅:What is a rune?

并将符文转换为字符串:

r := rune(181)
fmt.Printf("%#U\n", r) // U+00B5 'µ'
st := "this is UTF-8: " + string(r)
fmt.Println(st) // this is UTF-8: µ

将符文切片转换为字符串:

rs := []rune{181, 181, 181, 181}
sr := string(rs)
fmt.Println(sr) // µµµµ

将字符串转换为符文切片:

br := []rune(sr)
fmt.Println(br) //[181 181 181 181]

%q(带引号)动词将转义字符串中任何不可打印的字节序列,因此输出是明确的:

fmt.Printf("%+q \n", "Hello, 世界") // "Hello, \u4e16\u754c"

unicode.IsSpace报告符文是否是由Unicode的White Space属性定义的空格字符;在Latin-1空间中,这是

&#39; \ t&#39;,&#39; \ n&#39;,&#39; \ v&#39;,&#39; \ f&#39;,&#39; \ r&# 39;,&#39; &#39;,U + 0085(NEL),U + 00A0(NBSP)。 示例代码:

package main

import (
    "bytes"
    "fmt"
    "unicode"
)

func main() {
    var buf bytes.Buffer
    s := "\u4e16\u754c \u0020\r\n  世界"
    for _, r := range s {
        if unicode.IsSpace(r) {
            buf.WriteString(fmt.Sprintf("\\u%04x", r))
        } else {
            buf.WriteString(string(r))
        }
    }
    st := buf.String()
    fmt.Println(st)
}

输出:

世界\u0020\u0020\u000d\u000a\u0020\u0020世界

您可以在unicode/utf8unicodestrconvstrings套餐中找到更多功能:
https://golang.org/pkg/unicode/utf8/
https://golang.org/pkg/unicode/
https://golang.org/pkg/strings/
https://golang.org/pkg/strconv/

https://blog.golang.org/strings