import "code.google.com/p/go.text/transform"
transform包提供了对数据进行编码转换的读写接口的包装。主要用于编码转化和编码标准化等。
var (
// ErrShortDst代表目的地的缓冲太小,无法接受所有的转换后的字节
ErrShortDst = errors.New("transform: short destination buffer")
// ErrShortSrc表示数据来源的缓冲中的数据不完整,不能完成转换
ErrShortSrc = errors.New("transform: short source buffer")
)
type Transformer interface {
// Transform将从src读取的字节转换编码后写入dst,返回写入dst字节数和读取src字节数。
// atEOF参数用来说明src是否是输入的最后一部分字节。
// 调用者应总是在处理完读取的数据和写入生成的数据后再考虑错误问题。
// nil错误值表示所有转换后的字节(不管是刚刚转换的,还是之前调用Transform方法留下的)。
// 都已经写入了dst。不管atEOF参数是不是真,都可以返回nil的错误值。
// 如果返回值err为nil,nSrc必须等于len(src);反过来则不需要。
// ErrShortDst代表dst太短,不能接收所有编码后的字节;
// ErrShortSrc表示src有不完整的编码,不能完成转换;
// 如果两种情况都出现了,则可以返回两者中任一个。
// 除了这两个错误之外,具体实现可以返回任何错误(但它们会导致转换中止并向上层返回该错误)。
Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error)
}
Transformer转换字节数据。
var (
// Discard是一个Transformer。
// 它的所有Transform调用都会成功,会吃掉所有输入但不输入任何东西
Discard Transformer = discard{}
// Nop是一个Transformer。它的Transform方法会将src的数据原封不动的拷贝到dst
Nop Transformer = nop{}
)
func Chain(t ...Transformer) Transformer
Chain返回一个Transformer,会将提供给其的数据依次用生成时的Transformer处理。
func RemoveFunc(f func(r rune) bool) Transformer
RemoveFunc返回一个Transformer,它会将提供给它的输入流所有码值中满足f返回真的码值去掉。输入中的非法字节会被替换为RuneError。
input := []byte(`tschüß; до свидания`)
b := make([]byte, len(input))
t := transform.RemoveFunc(unicode.IsSpace)
n, _, _ := t.Transform(b, input, true)
fmt.Println(string(b[:n]))
t = transform.RemoveFunc(func(r rune) bool {
return !unicode.Is(unicode.Latin, r)
})
n, _, _ = t.Transform(b, input, true)
fmt.Println(string(b[:n]))
n, _, _ = t.Transform(b, norm.NFD.Bytes(input), true)
fmt.Println(string(b[:n]))
Output:
tschüß;досвидания tschüß tschuß
type Reader struct {
// 内含隐藏或非导出字段
}
Reader包装一个io.Reader接口,从下层读取的数据都会先进行编码转换再返回。
func NewReader(r io.Reader, t Transformer) *Reader
NewReader返回一个新的Reader,从r读取的数据都会先用t转换编码再返回。
func (r *Reader) Read(p []byte) (int, error)
Read方法实现了io.Reader接口。
type Writer struct {
// 内含隐藏或非导出字段
}
Writer包装一个io. Writer接口,向其写入的数据都会进行编码转换后再写入下层。调用者需要调用Close方法来将缓冲中未写入下层的数据刷新掉。
func NewWriter(w io.Writer, t Transformer) *Writer
NewWriter返回一个新的Writer,向其写入的数据都用t转换编码后再写入w。
func (w *Writer) Write(data []byte) (n int, err error)
Write方法实现了io. Writer接口。如果没有足够的字节来完成转换,会缓冲用于下一次Write方法。调用Close会将缓冲中的数据进行转换并写入下层。
func (w *Writer) Close() error
Close方法实现了io. Closer接口。
func Bytes(t Transformer, b []byte) (result []byte, n int, err error)
Bytes返回将b中的部分数据b[:n]用t转换编码后的切片result。返回值n <= len(s);如果发未遇到错误,返回值n == len(s)。
func String(t Transformer, s string) (result string, n int, err error)
String返回将s中的部分数据s[:n]用t转换编码后的字符串result。返回值n <= len(s);如果发未遇到错误,返回值n == len(s)。