私はエンコーディング(例えば、Windows-1256アラビア語)からUTF-8にテキストを変換する必要があるプロジェクトに取り組んでいます。GoでエンコーディングをUTF-8に変換するには?
Goでこれを行うにはどうすればよいですか?
私はエンコーディング(例えば、Windows-1256アラビア語)からUTF-8にテキストを変換する必要があるプロジェクトに取り組んでいます。GoでエンコーディングをUTF-8に変換するには?
Goでこれを行うにはどうすればよいですか?
あなたがパッケージgolang.org/x/text/encoding/charmap
経由でWindows-1256のサポートが含まれ、the encoding packageを使用することができます(以下の例では、このパッケージをインポートし、代わりにjapanese.ShiftJIS
のcharmap.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
エンコードを別のものに変換するライブサンプルが見つかりませんでした。ドットネットで行うのは簡単でしたが、ここでは本当に初心者です。 –
素晴らしいライブの例です。 うん、ここではUTF8から日本のシフトに変換しようとしていますが、これは逆も可能ですか? –
ShiftJISをデコードするには、「declare a decoder ...」で始まる2番目の部分を使用します。encSはデコードする文字列、string(decBytes)はデコードされた文字列です。たぶん2つの機能が改善されているかもしれませんが、私はその例をできるだけ短くしたいと思っていました... – rob74
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]
私はGoに堪能ではありませんが、バッファを大雑把に '* 2 'に割り当てることは恐ろしい考えです。理論的には、UTF-8は入力文字列の4倍のサイズになる可能性があります。 – deceze
これは単なる例です。 Win1256の文字の大部分は[2バイトを取る](http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1256.txt)で、3つ以上を取るものはありません。編集されました。 –
バッファをサイズ決めするための決定論的な方法があります。推測ではありません。 @ rob74の答えはそんな風に見えるようだ。 – deceze
*エンコーディング*を意味しますか? * Unicodeは1つしかありません。アラビア語の1256は、Unicodeではありません。 – deceze
あなたはそうです、Iv'eは質問を編集しました。ありがとう。 –