4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

KotlinでUTF-8からShiftJISに変換

Posted at

KotlinでUTF-8からShiftJISに変換する

あんまり例が無いのと宣言が無いなどのエラーが出るので試行錯誤してみました。

ShiftJISとは?

ルーターなどへのターミナル接続で使われることがある文字コードです。Androidでは何も考えなくてもUTF-8が標準で使われており、特に考えなくても問題がありません。
しかしShiftJISを使う場合にはShiftJIS特有のことを要求されます。

ShuftJISの特徴

0~9、A~Z、a~zや半角の記号を1バイトで表現します。いわゆるASCIIコードとも呼ばれる物です。
半角の文字が使用するのは16進数で 20h~7Fh、A0h~FFhの範囲で残りの00h~1Fh、80h~9Fhが拡張コードとして使用されます。※代表例でありこの限りでは無い

コード ShiftJIS文字
20h 半角空白
30h~39h 0~9の半角文字
41h~ A~

サンプルとして012ABC亜漢字表示を文字コードで表現します。
なお亜は漢字の1番最初にある漢字、漢字はまあ例として、表示はShiftJIS時代に5Cという文字コードが原因で散々文字化けを起こしたコードとして使いました。

|Sample|0|1|2|A|B|C|亜|漢|字|表|示|
|:--:|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|
|UTF-8|30|31|32|41|42|43|E4 BA 9C|E6 BC A2|E5 AD 97|E8 A1 A8|E7 A4 BA|
|SJIS|30|31|32|41|42|43|88 9F|8A BF||8E 9A||95 5C||8E A6|

ShiftJISはJISコードの値をこのコード範囲に収めるようにシフト処理をしたのでShiftJISと呼ばれています。シフトしないJISコードもサーマルプリンタなどではまだ使われています。

実際のコード

sample.kt
        val charset = Charset.forName("SJIS")
        val strUtf = "012ABC亜漢字表示"
        val strSjis = strUtf.toByteArray(charset)
        for(i in 0..strSjis.size-1){
            var c : Byte = strSjis[i]
            var s = "%X".format(c)
            Log.d("Sample","$s")
        }

特にライブラリの拡張無しでShiftJISに変換出来ました。SJISUTF-8に変更するとUTF-8のコードになります。

最後に

Stringに色々な文字コードが入るわけでは無く、String=UTF-8だと思っていた方が良いようです。バイト型の配列にするときに変換をかけることで他の文字コードに対応しています。
その他ファイルへの読み書きの時にも変換出来るようです。

ということは外部ライブラリへ渡す引数がString型だったりするとShiftJISで渡せないような・・・
あとで試して見ます。

4
1
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
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?