Hana道場【師範】のブログ

IchigoJamの徹底解説ブログ

IchigoJamで"UTF-8変換"してLINEを送る方法<その2>【IchigoJam × MixJuice × IFTTT】

f:id:hanadojo_sihan:20201013065828j:plain

IchigoJamで文字列をUTF-8変換して、文字化けせずLINEにカタカナ(日本語)のメッセージを送るプログラムを紹介します!

IFTTT でLINEにメッセージを送る方法は<その1>のブログをご覧ください。

hanadojo-sihan.hatenablog.com

 

今回挑戦するのはこちら↓

IchigoJamBASICでUTF-8変換しています。

 

【目次】

【プログラム】

5 CLS:POKE#1E03,1,34:INPUT S

10 ?"MJ GETS maker.ifttt.com/trigger/イベント名/with/key/Webhoocksのkey?value1=";

20 FOR I=0 TO LEN(S)-1

30 C=ASC(S+I):D=ASC(S+I+1)

40 IF C<160 ?STR$(S+I,1);:GOTO290

50 A=#82

60 IF C>176&&C<182 [I]=#A2+2*C%177

70 IF C>181&&C<192 [I]=#AB+2*C%182

80 IF C>191 IF C=192 [I]=#BF ELSE A=#83:[I]=#81+3*(C=194)+5*(C=195)+7*(C=196)

90 IF C>196&&C<202 [I]=#8A+C%197

100 IF C>201&&C<207 [I]=#8F+3*C%202

110 IF C>206&&C<212 [I]=#9E+C%207

120 IF C>211&&C<215 [I]=#A3+2*C%212

130 IF C>214&&C<220 [I]=#A9+C%215

140 IF D=222 [I]=[I]+1:F=1:IF C=192 [I]=#80:A=#83

150 IF D=223 [I]=[I]+2:F=2

160 IF C=220 [I]=#AF

170 IF C=166 [I]=#B2:A=#83

180 IF C=221 [I]=#B3

190 IF C>166&&C<172 [I]=#A1+2*C%167

200 IF C=172 [I]=#A3:A=#83

210 IF C=173 [I]=#A5:A=#83

220 IF C=174 [I]=#A7:A=#83

230 IF C=175 [I]=#83:A=#83

240 IF C=176 [I]=#BC:A=#83

250 IF C=164 [I]=#81:A=#80

260 IF C=161 [I]=#82:A=#80

270 ?"%E3%";HEX$(A);"%";HEX$([I]);

280 IF F I=I+1:F=0

290 NEXT

300 ?:LC0,10:?”>”;STR$(S):?

5,10,300行目はWebhoocksにHTTP通信してメッセージを送っている部分です。

<その1>で解説しています。

 

【実行画面】

?"ムカエニキテ

↓Enterを押すと

f:id:hanadojo_sihan:20201013072606p:plain

文字化けせず、ちゃんと日本語が送れました!

 

【プログラム解説】

①文字列入力、HTTP通信(GETメソッド)

5 CLS:POKE#1E03,1,34:INPUT S

10 ?"MJ GETS maker.ifttt.com/trigger/イベント名/with/key/Webhoocksのkey?value1=";

<その1>を参照してください。

 

②文字列のUTF-8変換

UTF-8変換サイトで変換(エンコード)の実験をしてみましょう。

<変換例>

ア→%E3%82%A2 イ→%E3%82%A4 ウ→%E3%82%A6

カ→%E3%82%AB ガ→%E3%82%AC キ→%E3%82%AD

ハ→%E3%83%8F バ→%E3%83%90 パ→%E3%83%91 ヒ→%E3%83%92

法則1:16進数2桁で表記
法則2:小文字(ァィゥェォ)のある行(ア行、ヤ行)は2飛ばし
法則3:濁点がある行(カ行、サ行、タ行)も2飛ばし
法則4:濁点+半濁点があるハ行は3飛ばし
法則5:その他の行(ナ行、マ行、ラ行)は1飛ばし
補足:「つ」だけ濁点+小文字がある。句読点や「ー」などは個別で設定。「ダ」から2つ目の値が#83になる。
 
<値の呼び方>本ブログの場合
ア → %E3%82%A2
16進数822つ目の値A23つ目の値と呼ぶことにします。

 

20 FOR I=0 TO LEN(S)-1  文字列の長さ分くりかえし

30 C=ASC(S+I):D=ASC(S+I+1) 変数Cは現在の文字のコード、変数Dは次の文字のコード

40 IF C<160 ?STR$(S+I,1);:GOTO290 カナ以外の文字はUTF-8変換する必要なし

50 A=#82 2つ目の値

60 IF C>176&&C<182 [I]=#A2+2*C%177 ア行の3つ目の値を配列に代入

70 IF C>181&&C<192 [I]=#AB+2*C%182 カ行、サ行の3つ目の値を配列に代入

80 IF C>191 IF C=192 [I]=#BF ELSE A=#83:[I]=#81+3*(C=194)+5*(C=195)+7*(C=196) タ行の3つ目の値を配列に代入(「ダ」以降、2つ目の値が#83になる)

90 IF C>196&&C<202 [I]=#8A+C%197 ナ行

100 IF C>201&&C<207 [I]=#8F+3*C%202 ハ行

110 IF C>206&&C<212 [I]=#9E+C%207 マ行

120 IF C>211&&C<215 [I]=#A3+2*C%212 ヤ行

130 IF C>214&&C<220 [I]=#A9+C%215 ラ行

140 IF D=222 [I]=[I]+1:F=1:IF C=192 [I]=#80:A=#83 濁点の場合、3つ目の値を1増やす

150 IF D=223 [I]=[I]+2:F=1 半濁点の場合、3つ目の値を2増やす

160 IF C=220 [I]=#AF 「ワ」

170 IF C=166 [I]=#B2:A=#83 「ヲ」

180 IF C=221 [I]=#B3 「ン」

190 IF C>166&&C<172 [I]=#A1+2*C%167 小文字のア行

200 IF C=172 [I]=#A3:A=#83 小文字の「ヤ」

210 IF C=173 [I]=#A5:A=#83 小文字の「ユ」

220 IF C=174 [I]=#A7:A=#83 小文字の「ヨ」

230 IF C=175 [I]=#83:A=#83 小文字の「ツ」

240 IF C=176 [I]=#BC:A=#83 「ー」

250 IF C=164 [I]=#81:A=#80 「、」

260 IF C=161 [I]=#82:A=#80 「。」

270 ?"%E3%";HEX$(A);"%";HEX$([I]); URLにUTF-8変換した文字列を付加

280 IF F I=I+1:F=0 濁点、半濁点の場合は1文字飛ばす

290 NEXT 文字列全て付加するまでくりかえし

 

IchigoJamのカナ表記で気をつける必要があるのは、濁点と半濁点です。

f:id:hanadojo_sihan:20201013084910p:plain

「ガ」で1文字ではなく、「カ」と「゛」の2文字使用しています(半濁点も同様)。

 

濁点「゛」の文字コードは222、半濁点「゜」の文字コードは223です。

<濁点と半濁点の処理>

30行目:変数Dで常に次の文字に、濁点と半濁点がないか調べる

140行目:もし 次の文字が濁点なら 現在のUTF-8の値に1増やす(ダだけ2つ目の値に影響あり)

150行目:もし 次の文字が半濁点なら 現在のUTF-8の値に2増やす

280行目:もし 次の文字が濁点or半濁点なら それを飛ばして次の文字へ

例えば

「カ゛」なら「カ」の3つ目の値に1増やして(ガの値にして)、次の文字「゛」は飛ばします。

「ハ゜」なら「ハ」の3つ目の値に2増やして(パの値にして)、次の文字「゜」は飛ばします。

 

プログラムっぽい処理はそれだけで、その他の文字のUTF-8変換はゴリ押しです!

 

③送信した文字列の表示(おまけのチャットっぽさ)

300 ?:LC0,10:?”>”;STR$(S):? 

 

★完成★

音やチャットっぽさはご自由に演出してください。

 

<その3>インターン(呼び鈴)を押すとLINEが届く「IoTインターホン」の紹介もあります。

hanadojo-sihan.hatenablog.com

 

IchigoSodaでWiFi環境のない場所でもLINEを送れるサービスを実装中のHana道場インターン生がいます。

しかもGPSで自分の位置情報も送れちゃう!?

完成をお楽しみに。

 

 

何かエラーや文字化けがありましたら、Twitterにてご指摘ください!

CC BY shoichi1031da / @shoichi1031da

twitter.com