Juliaで学ぶプログラミング エンコード・デコード

# テキストファイルの操作とエンコード・デコード

ファイル操作では読み取りしたもののデータ形式を意識することが必要です。

ポイント
- SHIF-JIS等異なる形式の テキストデーターの扱い
- バイト文字列とテキストへの相互変換

## 青空文庫からデータを読み込み UTF-8で保存しなさい。
- URL= "https://www.aozora.gr.jp/cards/000081/files/43754_ruby_17594.zip"

```julia
#using Pkg
#Pkg.add("ZipFile")
#Pkg.add("StringEncodings")
using ZipFile
using StringEncodings
downloadUrl_str = "https://www.aozora.gr.jp/cards/000081/files/43754_ruby_17594.zip"
download( downloadUrl_str, "chumonNoOi.zip" )

r = ZipFile.Reader("chumonNoOi.zip")
for f in r.files
      　println("Filename: $(f.name)")
      　text_strAry = readlines(f,enc"CP932") #cp932 = shift-jis
        open( f.name, "w" ) do wf
            for text_str in text_strAry 
              println( wf, text_str )
            end
        end
end
close(r)
```

##  先程のUTF-8のテキストを読み込み、最初の3行を画面出力しなさい
```julia
fileName_str = "chumonno_oi_ryoriten.txt"
open( fileName_str, "r" ) do f
           line_strAry = readlines(f)
           println(line_strAry[1:3])
end
```
```
["注文の多い料理店", "宮沢賢治", ""]
```


## UTF-8のテキストを読み込み、JISでファイル出力しなさい
```julia
fileName_str = "chumonno_oi_ryoriten.txt"
open( fileName_str, "r" ) do f
    line_strAry = readlines(f)
    text_str = join(line_strAry,"\n")    
    open("chumonno_oi_ryoriten_shiftJis.txt","w") do wf
        write(wf,encode(text_str,"shift-jis"))
    end
end
```
## JISのテキストを読み込み、最初の2行を画面出力しなさい
以下画面出力のことを出力、画面以外の場合はXX出力と書きます。

```julia
fileName_str = "chumonno_oi_ryoriten_shiftJIs.txt"
open( fileName_str, "r" ) do f
    line_strAry = readlines(f,enc"shift-jis")
    println(line_strAry[1:2])
end
```
```
["注文の多い料理店", "宮沢賢治"]
```

## テキストを読み込みバイト文字で最初の10個のデータを出力しなさい。

```julia
fileName_str = "chumonno_oi_ryoriten_shiftJIs.txt" #chumonno_oi_ryoriten.txtでも良い。その場合出力は異なる。
open( fileName_str, "r" ) do f
    data = read(f,enc"shift-jis")
    println(data[1:10])
end
```
```
UInt8[0xe6, 0xb3, 0xa8, 0xe6, 0x96, 0x87, 0xe3, 0x81, 0xae, 0xe5]
```

## バイト化文字列を読み込みテキストに変換し出力しなさい。

```julia
fileName_str = "chumonno_oi_ryoriten_shiftJIs.txt" 
open( fileName_str, "r" ) do f
    data = read(f)
    s = decode(data, "shift-jis")　
    println(s)
end
```
デコードで文字コード指定はUTF-8であっても省略できない。
```julia
fileName_str = "chumonno_oi_ryoriten.txt" 
open( fileName_str, "r" ) do f
    data = read(f)
    s = decode(data,"utf-8")　#デコードでは"utf-8"の指定を省略できない。
    println(s)
end
```
```
注文の多い料理店
宮沢賢治

-------------------------------------------------------
【テキスト中に現れる記号について】

《》：ルビ
（例）紳士《しんし》

｜：ルビの付く文字列の始まりを特定する記号
（例）二｜疋《ひき》

［＃］：入力者注　主に外字の説明や、傍点の位置の指定
（例）［＃ここから４字下げ、横書き、中央揃え、罫囲み］
-------------------------------------------------------

　二人の若い紳士《しんし》が、すっかりイギリスの兵隊のか
（以下省略）
```

## テキストを１行だけ読み込み出力しなさい
```julia
fileName_str = "chumonno_oi_ryoriten_shiftJIs.txt"
open( fileName_str, "r" ) do f
    line_str = readline(f,enc"shift-jis")
    println(line_str)
end
```
```
注文の多い料理店
```
備考 ちなみにreadlineはイテレーター

## 「注文の多い料理店」をUtf-8でバイト化し、出力しなさい。
```julia
text_str = "注文の多い料理店"
println(encode(text_str,"utf-8"))
```
```
UInt8[0xe6, 0xb3, 0xa8, 0xe6, 0x96, 0x87, 0xe3, 0x81, 0xae, 0xe5, 0xa4, 0x9a, 0xe3, 0x81, 0x84, 0xe6, 0x96, 0x99, 0xe7, 0x90, 0x86, 0xe5, 0xba, 0x97]
```

### 解説
- read(path)はバイト文字列になる
- read(path, String, enc"UTF-16")など文字コードを指定することでテキスト読み込みできる
- readline,readlinesはテキストで読み込み
- read,write(line,lines含む)はenc"文字コード名"でutf-8以外を指定できる
- decodeでバイト文字列からテキストへ変換
- encodeでテキストからバイト文字列へ変換