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コードもサーマルプリンタなどではまだ使われています。
実際のコード
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に変換出来ました。SJISをUTF-8に変更するとUTF-8のコードになります。
最後に
Stringに色々な文字コードが入るわけでは無く、String=UTF-8だと思っていた方が良いようです。バイト型の配列にするときに変換をかけることで他の文字コードに対応しています。
その他ファイルへの読み書きの時にも変換出来るようです。
ということは外部ライブラリへ渡す引数がString型だったりするとShiftJISで渡せないような・・・
あとで試して見ます。