我写了个读文件的程序
只是读一个简单的txt文件,但里面含有中文
package main
import (
"fmt"
file "io/ioutil"
// utf "unicode/utf8"
)
func main() {
readbuf, _ := file.ReadFile("test.txt")
str := string(readbuf)
buf := []rune(str)
//buf, l := utf.DecodeRune(readbuf)
l := len(buf)
for i := 0; i < l; i++ {
fmt.Printf("%c", buf[i])
}
}
我想问下unicode/utf包中有下面两个函数,是不是将从文件中读出的[]byte类型转换成[]rune类型啊?感觉不像,那要怎么转换才可以呢,我用上面的代码倒是实现了,但感觉应该不是这样的,而且我还把test.txt转换成utf8编码才可以。求大神讲解下!
func DecodeRune(p []byte) (r rune, size int)
func EncodeRune(p []byte, r rune) int
更多评论
这两个函数是针对单个rune和[]byte之间的转换。
utf8编码时,一个字符可能需要1、2、3或4个字节表示;在go中,一个utf8字符用rune类型表示;所以,这里的Encode和Decode是针对一个rune到[]byte的转换。
如下代码示例:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
r := '中'
p := make([]byte, 3)
n := utf8.EncodeRune(p, r)
fmt.Printf("bytes: %v, nums: %d\n", p, n)
newRune, n := utf8.DecodeRune(p)
fmt.Printf("rune: %c, nums: %d\n", newRune, n)
}
输出:
- bytes: [228 184 173], nums: 3
- rune: 中, nums: 3
至于说怎么实现你要求的功能,代码如下:
package main
import (
"fmt"
"io/ioutil"
)
func main() {
readbuf, _ := ioutil.ReadFile("test.txt")
str := string(readbuf)
for _, word := range str {
fmt.Printf("%c\t", word)
}
}
不过,如果文件不是utf8编码,这样读出来会乱码。这个时候需要进行编码转换,可以看看:[Go中进行字符集转换](http://studygolang.com/resources/42)。
**题外话**,如果文件很大,最好别这么一次性读取内容。
#1