From 97fb62f51ece9353d620780fd13cb9c520413fb8 Mon Sep 17 00:00:00 2001 From: lunnyxiao Date: Wed, 20 Aug 2014 16:34:48 +0800 Subject: [PATCH] auto detect text file encode and convert to utf8 --- routers/repo/view.go | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/routers/repo/view.go b/routers/repo/view.go index 9562bb78..bd1dcb8f 100644 --- a/routers/repo/view.go +++ b/routers/repo/view.go @@ -6,6 +6,7 @@ package repo import ( "bytes" + "fmt" "io/ioutil" "path" "path/filepath" @@ -14,12 +15,30 @@ import ( "github.com/gogits/gogs/modules/base" "github.com/gogits/gogs/modules/git" "github.com/gogits/gogs/modules/middleware" + + "code.google.com/p/mahonia" + "github.com/saintfish/chardet" ) const ( HOME base.TplName = "repo/home" ) +func toUtf8(content []byte) (error, string) { + detector := chardet.NewTextDetector() + result, err := detector.DetectBest(content) + if err != nil { + return err, "" + } + + if result.Charset == "utf8" { + return nil, string(content) + } + + decoder := mahonia.NewDecoder(result.Charset) + return nil, decoder.ConvertString(string(content)) +} + func Home(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Repo.Repository.Name @@ -98,7 +117,12 @@ func Home(ctx *middleware.Context) { if readmeExist { ctx.Data["FileContent"] = string(base.RenderMarkdown(buf, "")) } else { - ctx.Data["FileContent"] = string(buf) + if err, content := toUtf8(buf); err != nil { + fmt.Println("transfer encode error:", err) + ctx.Data["FileContent"] = string(buf) + } else { + ctx.Data["FileContent"] = content + } } } }