LoginSignup
6
5

More than 5 years have passed since last update.

Golang 文字エンコーディングについて

Last updated at Posted at 2019-04-06

はじめに

エンコーディング関係がほんとめんどくさくて参っているのでとりあえず自分の知識をまとめます。

エンコーディングの種類

基本的にUTF8,Shift_JIS,EUC_JPの3つがある感じ。

UTF8が一番汎用性があるというかどこでも使える感じだと思う。

Shift_JISはWindowsで使われていて、EUC_JPはMacで使われています。

問題はShift_JISで結構厄介な文字化け問題がおきます。:frowning2:

文字コードの変換(transform.NewReader())

文字コードを変えるときのコードで一般的なのがtransform.NewReaderを使うこれ↓だと思います。

sample := "こんにちは"
// Shift_JISからUTF8に変換
str := transform.NewReader(sample, japanese.Shift_JIS.NewDecoder())
// UTF8からShift_JISに変換
str := transform.NewReader(sample, japanese.Shift_JIS.NewEncoder())
// EUC_JPからUTF8に変換
str := transform.NewReader(sample, japanese.EUCJP.NewDecoder())
// UTF8からEUC_JPに変換
str := transform.NewReader(sample, japanese.EUCJP.NewEncoder())

という感じ

UTF8に変換するときはNewDecoder()を使いShift_JIS,EUC_JPに変換するときはNewEncoder()を使う感じっぽいですね。

でもこれエラーとか出てくれないけど良いんですかね?

正直エラーが出る場合があるかもしれないのでエラーを検知できるようにしてほしいな....

例えば

str := transform.NewReader(sample, unicode.UTF*.NewDecoder())

みたいにするとsampleがそのまま出力されるんですよね。

なんかエラーが発生してないから大丈夫と思いきや問題あったみたいなことになりそうなので怖いです。

文字コードの変換(transform.Strings())

transform.Stringsを使ってエンコードを変える方法もあります。

これはエラーも補足できるので個人的にはこっちのほうが良いような気がします。

// UTF8からShiftJISに変換
str, n, err := transform.String(japanese.ShiftJIS.NewEncoder(), sample)
// ShiftJISからUTF8に変換
str, n, err := transform.String(japanese.ShiftJIS.NewDecoder(), sample)
// UTF8からEUC_JPに変換
str, n, err := transform.String(japanese.EUCJP.NewEncoder(), sample)
// EUC_JPからUTF8に変換
str, n, err := transform.String(japanese.EUCJP.NewDecoder(), sample)

みたいな感じ。

UTF8からShiftJISに変換した際に文字化けする

UTF8からShiftJISに変換した際に文字化けが発生することがあるようです。

巷では「Shift_JISのだめ文字」と言われるそうですが、文字の2バイト目が「|,/,\,@」などの文字コードと重なる場合に文字バケが起きてしまうそうです。

説明が下手すぎで何言ってるかわからないと思うのでこちらを参考にしてください↓

https://sites.google.com/site/fudist/Home/grep/sjis-damemoji-jp
https://sites.google.com/site/fudist/Home/grep/sjis-damemoji-jp/table

windowsの文字化け問題は面倒なので即刻どうにかしてほしいものです。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5