123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- package mahonia
- import (
- "unicode/utf8"
- )
- // ConvertString converts a string from UTF-8 to e's encoding.
- func (e Encoder) ConvertString(s string) string {
- dest := make([]byte, len(s)+10)
- destPos := 0
- for _, rune := range s {
- retry:
- size, status := e(dest[destPos:], rune)
- if status == NO_ROOM {
- newDest := make([]byte, len(dest)*2)
- copy(newDest, dest)
- dest = newDest
- goto retry
- }
- if status == STATE_ONLY {
- destPos += size
- goto retry
- }
- destPos += size
- }
- return string(dest[:destPos])
- }
- // ConvertString converts a string from d's encoding to UTF-8.
- func (d Decoder) ConvertString(s string) string {
- bytes := []byte(s)
- runes := make([]rune, len(s))
- destPos := 0
- for len(bytes) > 0 {
- c, size, status := d(bytes)
- if status == STATE_ONLY {
- bytes = bytes[size:]
- continue
- }
- if status == NO_ROOM {
- c = 0xfffd
- size = len(bytes)
- status = INVALID_CHAR
- }
- bytes = bytes[size:]
- runes[destPos] = c
- destPos++
- }
- return string(runes[:destPos])
- }
- // ConvertStringOK converts a string from UTF-8 to e's encoding. It also
- // returns a boolean indicating whether every character was converted
- // successfully.
- func (e Encoder) ConvertStringOK(s string) (result string, ok bool) {
- dest := make([]byte, len(s)+10)
- destPos := 0
- ok = true
- for i, r := range s {
- // The following test is copied from utf8.ValidString.
- if r == utf8.RuneError && ok {
- _, size := utf8.DecodeRuneInString(s[i:])
- if size == 1 {
- ok = false
- }
- }
- retry:
- size, status := e(dest[destPos:], r)
- switch status {
- case NO_ROOM:
- newDest := make([]byte, len(dest)*2)
- copy(newDest, dest)
- dest = newDest
- goto retry
- case STATE_ONLY:
- destPos += size
- goto retry
- case INVALID_CHAR:
- ok = false
- }
- destPos += size
- }
- return string(dest[:destPos]), ok
- }
- // ConvertStringOK converts a string from d's encoding to UTF-8.
- // It also returns a boolean indicating whether every character was converted
- // successfully.
- func (d Decoder) ConvertStringOK(s string) (result string, ok bool) {
- bytes := []byte(s)
- runes := make([]rune, len(s))
- destPos := 0
- ok = true
- for len(bytes) > 0 {
- c, size, status := d(bytes)
- switch status {
- case STATE_ONLY:
- bytes = bytes[size:]
- continue
- case NO_ROOM:
- c = 0xfffd
- size = len(bytes)
- ok = false
- case INVALID_CHAR:
- ok = false
- }
- bytes = bytes[size:]
- runes[destPos] = c
- destPos++
- }
- return string(runes[:destPos]), ok
- }
|