/
writer.go
69 lines (59 loc) · 1.86 KB
/
writer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*
Copyright 2014 Tamás Gulácsi
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package text
import (
"bytes"
"io"
"golang.org/x/text/encoding"
"golang.org/x/text/transform"
)
// NewWriter returns a writer which encodes to the given encoding, utf8.
//
// If enc is nil, then only an utf8-enforcing replacement writer
// (see http://godoc.org/code.google.com/p/go.text/encoding#pkg-variables)
// is used.
func NewWriter(w io.Writer, enc encoding.Encoding) io.WriteCloser {
if enc == nil || enc == encoding.Replacement {
return transform.NewWriter(w, encoding.Replacement.NewEncoder())
}
return transform.NewWriter(w, transform.Chain(enc.NewEncoder()))
}
var encBufs = make(chan bytes.Buffer, 4)
// Encode encodes the bytes from utf8 to the given encoding (an allocating, convenience version of transform.Transform).
func Encode(p string, enc encoding.Encoding) ([]byte, error) {
var dst bytes.Buffer
select {
case dst = <-encBufs:
default:
}
w := NewWriter(&dst, enc)
_, err := io.WriteString(w, p)
if err != nil {
return nil, err
}
if err = w.Close(); err != nil {
return nil, err
}
res := make([]byte, dst.Len())
copy(res, dst.Bytes())
dst.Reset()
select {
case encBufs <- dst:
default:
}
return res, nil
}
// NewEncodingWriter is deprecated, has been renamed to NewWriter.
func NewEncodingWriter(w io.Writer, enc encoding.Encoding) io.WriteCloser {
return NewWriter(w, enc)
}