2015-09-11 16 views
7

私はエンコーディング(例えば、Windows-1256アラビア語)からUTF-8にテキストを変換する必要があるプロジェクトに取り組んでいます。GoでエンコーディングをUTF-8に変換するには?

Goでこれを行うにはどうすればよいですか?

+0

*エンコーディング*を意味しますか? * Unicodeは1つしかありません。アラビア語の1256は、Unicodeではありません。 – deceze

+0

あなたはそうです、Iv'eは質問を編集しました。ありがとう。 –

答えて

9

あなたがパッケージgolang.org/x/text/encoding/charmap経由でWindows-1256のサポートが含まれ、the encoding packageを使用することができます(以下の例では、このパッケージをインポートし、代わりにjapanese.ShiftJIScharmap.Windows1256を使用します)。

ここでは、日本語のUTF-8文字列をShiftJISエンコードにエンコードし、ShiftJIS文字列をUTF-8にデコードする簡単な例を示します。残念ながら、プレイグラウンドには "x"パッケージがないため、プレイグラウンドでは動作しません。

package main 

import (
    "bytes" 
    "fmt" 
    "io/ioutil" 
    "strings" 

    "golang.org/x/text/encoding/japanese" 
    "golang.org/x/text/transform" 
) 

func main() { 
    // the string we want to transform 
    s := "今日は" 
    fmt.Println(s) 

    // --- Encoding: convert s from UTF-8 to ShiftJIS 
    // declare a bytes.Buffer b and an encoder which will write into this buffer 
    var b bytes.Buffer 
    wInUTF8 := transform.NewWriter(&b, japanese.ShiftJIS.NewEncoder()) 
    // encode our string 
    wInUTF8.Write([]byte(s)) 
    wInUTF8.Close() 
    // print the encoded bytes 
    fmt.Printf("%#v\n", b) 
    encS := b.String() 
    fmt.Println(encS) 

    // --- Decoding: convert encS from ShiftJIS to UTF8 
    // declare a decoder which reads from the string we have just encoded 
    rInUTF8 := transform.NewReader(strings.NewReader(encS), japanese.ShiftJIS.NewDecoder()) 
    // decode our string 
    decBytes, _ := ioutil.ReadAll(rInUTF8) 
    decS := string(decBytes) 
    fmt.Println(decS) 
} 

日本のStackOverflowサイトに関するより完全な例があります。テキストは日本語ですが、コードは自明です。https://ja.stackoverflow.com/questions/6120

+0

エンコードを別のものに変換するライブサンプルが見つかりませんでした。ドットネットで行うのは簡単でしたが、ここでは本当に初心者です。 –

+0

素晴らしいライブの例です。 うん、ここではUTF8から日本のシフトに変換しようとしていますが、これは逆も可能ですか? –

+0

ShiftJISをデコードするには、「declare a decoder ...」で始まる2番目の部分を使用します。encSはデコードする文字列、string(decBytes)はデコードされた文字列です。たぶん2つの機能が改善されているかもしれませんが、私はその例をできるだけ短くしたいと思っていました... – rob74

2

golang.org/x/textのモジュールを使用してください。あなたの場合、これは次のようなものになります:

b := /* Win1256 bytes here. */ 
dec := charmap.Windows1256.NewDecoder() 
// Take more space just in case some characters need 
// more bytes in UTF-8 than in Win1256. 
bUTF := make([]byte, len(b)*3) 
n, _, err := dec.Transform(bUTF, b, false) 
if err != nil { 
    panic(err) 
} 
bUTF = bUTF[:n] 
+0

私はGoに堪能ではありませんが、バッファを大雑把に '* 2 'に割り当てることは恐ろしい考えです。理論的には、UTF-8は入力文字列の4倍のサイズになる可能性があります。 – deceze

+0

これは単なる例です。 Win1256の文字の大部分は[2バイトを取る](http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1256.txt)で、3つ以上を取るものはありません。編集されました。 –

+0

バッファをサイズ決めするための決定論的な方法があります。推測ではありません。 @ rob74の答えはそんな風に見えるようだ。 – deceze

関連する問題