@@ -25,26 +25,41 @@ const (
25
25
// ErrUnexpectedByte happens when someone tries to decode non GSM 7-bit encoded string.
26
26
var ErrUnexpectedByte = errors .New ("7bit decode: met an unexpected byte" )
27
27
28
- // Encode7Bit encodes the given UTF-8 text into GSM 7-bit (3GPP TS 23.038) encoding with packing.
28
+ // Is7BitEncodable reports whether s can be encoded using GSM 7-bit
29
+ // encoding with default alphabet, without replacing or omitting characters.
30
+ func Is7BitEncodable (s string ) bool {
31
+ for _ , r := range s {
32
+ if i := gsmTable .Index (r ); i < 0 {
33
+ if gsmEscapes .to7Bit (r ) == byte (unknown ) {
34
+ return false
35
+ }
36
+ }
37
+ }
38
+ return true
39
+ }
40
+
41
+ // Encode7Bit encodes the given UTF-8 text into GSM 7-bit (3GPP TS 23.038)
42
+ // encoding with packing. Invalid characters outside the 7-bit encoding
43
+ // and shift table are replaced with "?".
29
44
func Encode7Bit (str string ) []byte {
30
45
raw7 := make ([]byte , 0 , len (str ))
31
46
for _ , r := range str {
32
- i := gsmTable .Index (r )
33
- if i < 0 {
47
+ if i := gsmTable .Index (r ); i >= 0 {
48
+ raw7 = append (raw7 , byte (i ))
49
+ } else {
34
50
b := gsmEscapes .to7Bit (r )
35
- if b != byte (unknown ) {
36
- raw7 = append (raw7 , Esc , b )
37
- } else {
51
+ if b == byte (unknown ) {
38
52
raw7 = append (raw7 , b )
53
+ } else {
54
+ raw7 = append (raw7 , Esc , b )
39
55
}
40
- continue
41
56
}
42
- raw7 = append (raw7 , byte (i ))
43
57
}
44
58
return pack7Bit (raw7 )
45
59
}
46
60
47
- // Decode7Bit decodes the given GSM 7-bit packed octet data (3GPP TS 23.038) into a UTF-8 encoded string.
61
+ // Decode7Bit decodes the given GSM 7-bit packed octet data (3GPP TS 23.038)
62
+ // into an UTF-8 encoded string.
48
63
func Decode7Bit (octets []byte ) (str string , err error ) {
49
64
raw7 := unpack7Bit (octets )
50
65
var escaped bool
@@ -188,8 +203,8 @@ var gsmEscapes = escapeTable{
188
203
type runeTable [0x80 ]rune
189
204
190
205
func (rt * runeTable ) Index (r rune ) int {
191
- for i := range rt {
192
- if rt [ i ] == r {
206
+ for i , c := range rt {
207
+ if c == r {
193
208
return i
194
209
}
195
210
}
0 commit comments