UTF-8 文字列から Shift_JIS へ変換する WROOM(ESP8266)用 Arduino IDE ライブラリを作ってみました

ESP8266 ( ESP-WROOM-02 )

こんばんは。

WebSocketリアルタイム電光掲示板を作成中で、結構プログラムが長くなってきました。
そこで、文字コード変換もライブラリ化する必要に迫られたので作ってみました。

Arduino IDE はUTF-8コード入力ですが、日本語Windows PC のシリアルモニターはShift_JISコードがデフォルトですので、漢字表示は文字化してしまいます。
そこで、このライブラリを使えば、簡単なスケッチでシリアルモニターに漢字表示できます。

このライブラリは文字列の UTF-8 コードを一括して Shift_JIS コードに変換します。
ESP-WROOM-02 ( ESP8266 )専用の Arduino IDE ライブラリです。
半角カナやJIS13区文字も変換してくれます。

以前の記事でバイナリの変換テーブルファイルの使い方を説明しましたが、それをArduino IDEライブラリ化したものです。

これもMITライセンスです。自由に使ってやってください。

では、ザッとこの使い方を説明します。

ESP-WROOM-02はスイッチサイエンスさんの開発ボードが推奨です。

ESP-WROOM-02開発ボード
スイッチサイエンス(Switch Science)

ESPr Developer(ピンソケット実装済)
スイッチサイエンス(Switch Science)
¥2,420(2021/09/09 23:54時点)

このボードは使いやすくて、手放せません。
最近はこればっかり使ってます。
初めてこれを使う方はこちらのページを参照してください。

スポンサーリンク

1.予めArduino IDE にESP8266ボードとSPIFFSファイルシステムアップローダーをインストールしておく

何度もこのボードを使用されてる方は読み飛ばしてください。

予め、Arduino IDE にESP8266ボードをインストールしておきます。
インストール方法はこちらのページを参照してください。

Arduino IDEプラグインのSPIFFSファイルシステムアップローダーのインストール方法はこちらのページを参照してください。

2.自作ライブラリをインストールする。

自作したライブラリは、GitHub のこちらのページ にあります。
ZIPファイルをダウンロードして、解凍しておいてください。
解凍したファイルの “UTF8SJIS_for_ESP8266-master” というフォルダをフォルダごとArduino IDE の libraries フォルダにコピーしてください。
そうしたら、ライブラリが使用可能になります。

3.サンプルスケッチを入力する

サンプルスケッチはこんな感じになります。
ライブラリを使うと、だいぶシンプルになりますね。
因みに、ツィッターを見ていたら、char型やint、long型は使わない方が良いという情報があり、uint8_t型を使っています。こっちの方がバイト数が良く分かりますねぇ。
【ソースコード】 (※無保証 ※PCの場合、ダブルクリックすればコード全体を選択できます)

#include <UTF8toSJIS.h>

const char* UTF8SJIS_file = "/Utf8Sjis.tbl"; //SPIFFSファイルシステムで予めこのファイルをアップロードしておくこと

UTF8toSJIS u8ts;

void setup() {
  Serial.begin(115200);
  String str = "こんにちは!! 今日は晴れ時々曇り。半角カタカナも表示できます。";
  
  uint8_t sj_txt[str.length()];
  
  uint16_t sj_length;
  
  u8ts.UTF8_to_SJIS_str_cnv(UTF8SJIS_file, str, sj_txt, &sj_length);
  
  Serial.println();
  int i=0;
  for(i=0;i<sj_length;i++){ //Shift_JISコードを表示
    Serial.printf("%X,",sj_txt[i]);
  }
  Serial.println();
  for(i=0;i<sj_length;i++){ //Shift_JISコードをシリアルモニターにバイナリ出力
    Serial.write(sj_txt[i]);
  }
  Serial.println();
  
}

void loop() {
}

●1行目で自作ライブラリをインクルードしてます。

●3行目:ここでSPIFFSファイルシステムアップローダーでESP-WROOM-02のフラッシュへアップロードしたファイル名を定義しています。
ここで注意してほしいのが、スラッシュ “/” を必ず入れてください

●5行目:ライブラリのクラス名を定義

●11行目でバイト配列を定義しますが、最大数をstr.length()にするところが重要です。

●15行目が自作ライブラリ関数です。
配列sj_txtにポインタでShift_JISコードを返しています。
&sj_lengthは ‘&’ という文字が重要です。ポインタのアドレスを示しています。つまり、Shift_JISコードのバイト数を返しています。

次にこのスケッチを名前を付けて保存して、下図のようにそのスケッチフォルダを開いて下さい。

そこに”data”フォルダを作成しておいてください。

このdataフォルダに当方で自作したUTF-8 Shift_JIS 変換テーブルファイルをコピーします。
GitHubのこちらのページ から Utf8Sjis.tbl ファイルをダウンロードしてコピーしておいてください。
この変換テーブルファイルについてはこちらのページに詳細がありますので、ご参照ください。

そして、SPIFFSファイルシステムアップローダーをクリックするとESP-WROOM-02 のフラッシュへアップロードされます。

4.コンパイル実行させる

コンパイル実行させると、こんな感じでシリアルモニターに表示されます。

最初の行はESP-WROOM-02 おなじみの起動時文字化けデータ。
これは無視して結構です。

2行目はShift_JISコードに変換された様子です。

3行目は文字コードをSerial.write でバイナリ出力すると文字として表示されます。

半角カナもちゃんと表示されてますね。

これで、Shift_JISコードのフォントデータも気軽に使えそうです。
プログラムの行数もかなり節約できました。

実は今、WebSocket通信リアルタイム電光掲示板が完成しつつあるのですが、これでも当ブログにアップするにはまだスケッチが大きすぎるんです。

さて、どうやって簡単にしようか・・・。

というわけで、今回はここまでです。
次回こそはリアルタイム電光掲示板をアップしたいと思います。

Amazon.co.jp 当ブログのおすすめ

M5Stack Basic
スイッチサイエンス
¥5,203(2021/09/09 23:54時点)
ESPr Developer 32
スイッチサイエンス(Switch Science)
¥2,200(2021/09/09 23:54時点)
ZEROPLUS ロジックアナライザ LAP-C(16032)
ZEROPLUS
¥15,728(2021/09/09 23:54時点)
Excelでわかるディープラーニング超入門
技術評論社
¥2,068(2021/09/09 23:54時点)

コメント

  1. haiga より:

    mgo-tecさま

    こんにちは、haigaと申します。
    mgo-tecさまのfontやILI9341 LCD ライブラリーには大変お世話になっております。cmのツールにも使用させて頂いております。

    コメントへの書き込みは、ESP32で計測したデータをWindowsPCのCOMに送るとUTF8の文字化けが起こるので、本記事を参考にUtf8Sjis.tblをSDに入れ、ESP32_SD_UTF8toSJISライブラリーを使って文字コード変換を試みておりますが、
    u8ts.UTF8_to_SJIS_str_cnv(UTF8SJIS_file, str, sj_txt, &sj_length); の部分で

    no matching function for call to ‘ESP32_SD_UTF8toSJIS::UTF8_to_SJIS_str_cnv(const char*&, String&, uint8_t&, uint16_t*)’
    のエラーが出ます。
    このページのコードは、元々はSPIFFSファイルシステムを使っておられますが、ESP32_SD_UTF8toSJISライブラリーとも関数の互換があるように見えるのですが・・・
    エラーの原因がどこにあるものか判らす、質問させて頂きました。

    テストに使ったコードは以下です。よろしくお願いいたします。

    #include "ESP32_SD_ShinonomeFNT.h"
    #include "ESP32_SD_UTF8toSJIS.h"
    #include "???"
     
    const char* UTF8SJIS_file = "/font/Utf8Sjis.tbl"; 
    const char* Shino_Zen_Font_file = "/font/shnmk16.bdf"; 
    const char* Shino_Half_Font_file = "/font/shnm8x16.bdf"; 
    
    const uint8_t sck  =  18; 
    const uint8_t mosi =  23; 
    const uint8_t miso =  19; 
    const uint8_t CS_SD =  17; 
     
    ESP32_SD_ShinonomeFNT SFR(CS_SD, 24000000);
    ESP32_SD_UTF8toSJIS u8ts;
     
    void setup() {
      pinMode(CS_SD,OUTPUT);
      SPI.begin(); 
      SFR.SD_Shinonome_Init3F(UTF8SJIS_file, Shino_Half_Font_file, Shino_Zen_Font_file);
    
      SFR.SD_Shinonome_Close3F(); 
      delay(2000);
      SFR.SD_Shinonome_Init2F(Shino_Half_Font_file, Shino_Zen_Font_file); 
      u8ts.ESP32_SD_UTF8toSJIS_Init(UTF8SJIS_file); 
    
      Serial.begin(115200);
      String str = "こんにちは!! 今日は晴れ時々曇り。半角カタカナも表示できます。";
       
      uint8_t sj_txt[str.length()];
       
      uint16_t sj_length;
       
      u8ts.UTF8_to_SJIS_str_cnv(UTF8SJIS_file, str, sj_txt, &sj_length);
       
      Serial.println();
      int i=0;
      for(i=0;i<sj_length;i++){ //Shift_JISコードを表示
        Serial.printf("%X,",sj_txt[i]);
      }
      Serial.println();
      for(i=0;i<sj_length;i++){ //Shift_JISコードをシリアルモニターにバイナリ出力
        Serial.write(sj_txt[i]);
      }
      Serial.println();
       
    }
     
    void loop() {
    }
    • mgo-tec mgo-tec より:

      haigaさん

      記事をご覧いただきありがとうございます。
      コメントして下さったコードはコメント投稿に入力してしまうと、<>や&などの特殊文字は消えてしまいます。
      その場合は
      <pre> ~コード~</pre>
      のようにpreタグで囲ってみて下さい。

      さて、過去の記事は現在の環境では動かないことも多々あることをご了承ください。

      改めて私のライブラリコードを見返すと、externを使っていたりして、今思うとかなり恥ずかしいコードだったなぁと思います。
      まだライブラリ作成に慣れていなかったのです。
      また、当時は将来性や保守性を何も考えておらず、思い付きで作っていたので、ESP8266とESP32のライブラリの互換性はありません。
      今思うといろいろ未熟だったのでご容赦ください。

      ところで、ESP32で私のライブラリを使ってUTF-8をShift_JISコードに変換するだけのサンプルコードは以下で試してみて下さい。

      #include "ESP32_SD_UTF8toSJIS.h"
       
      const char* UTF8SJIS_file = "/font/Utf8Sjis.tbl"; 
      
      //const int8_t sck = 18;
      //const int8_t miso = -1;
      //const int8_t mosi = 23;
      const int8_t CS_SD = 4; // Chip Select pin
      
      ESP32_SD_UTF8toSJIS u8ts;
      File _UtoS;
      
      void setup() {
        Serial.begin(115200);
        Serial.println();
        String str = "こんにちは!! 今日は晴れ時々曇り。半角カタカナも表示できます。";
      
        uint8_t sj_txt[str.length()] = {0};
      
        uint16_t sj_length = 0;
      
        SD.begin(CS_SD, SPI, 24000000, "/sd");
      
        Serial.println("card initialized.");
        _UtoS = SD.open(UTF8SJIS_file, FILE_READ);
        if (!_UtoS) {
          Serial.print(UTF8SJIS_file);
          Serial.println(" File not found");
          return;
        }else{
          Serial.print(UTF8SJIS_file);
          Serial.println(" File read OK!");
        }
        u8ts.UTF8_to_SJIS_str_cnv(_UtoS, str, sj_txt, &sj_length);
      
        Serial.println();
        for(int i = 0; i < sj_length; i++){ //Shift_JISコードを表示
          Serial.printf("%02X,", sj_txt[i]);
        }
        Serial.println();
      
        /*
         最近のArduino IDEはUTF-8対応しているので、
         Shift_JISでバイナリ出力すると逆に文字化けするので注意
         */
      }
      void loop(){
      }

      環境は以下です。
      Arduino IDE 1.8.15
      Arduino core for the ESP32 stable 1.0.6
      ESP32_SD_UTF8toSJIS beta ver 1.22

      これはM5Stack Basicで動作確認しました。
      シリアルモニタにShift_JISコードが表示されると思います。

      ただし、ご存知だと思いますが、現在のArduino IDEのシリアルモニタはUTF-8表示となっていますので、Shift_JISコードをシリアルモニタにバイナリ出力しても漢字表示しません。
      また、Windows 10も近々UTF-8に統一され、Shift_JISは終わりを告げると思います。
      Windows 10にシリアル出力して文字化けするのなら、Windows 10の設定がまだShit_JISのためだと思われます。
      Windows10自体の設定をUTF-8に変更すると、昔のアプリが文字化けする可能性はありますが、そろそろUTF-8に設定を変えたいところですね。
      因みに、Tera Termなどのフリーのシリアル出力モニタを使うと、UTF-8に変換してシリアル表示させることもできます。

      また、M5StackでSDカードで東雲フォント表示させる場合は、以下の記事を参照してください。
      https://www.mgo-tec.com/blog-entry-m5stack-font-scrolle-esp32.html/3

  2. haiga より:

    mgo-tecさま

    早速のご教授、ありがとうございました。
    おかげさまで、ESP32からBluetooth経由でWindows10 PCのExcel(VBA)にデータ転送できました。
    WINDOWS10はUTF8化できるのですが、古いExcelファイルとの互換性の問題でなかなか切り替えが難しいのが現場的な悩みです。

    このツールはArduinoで計測したデータを漢字含みの計測データファイル(SD)に書き込むにも重宝致します。結構mcがらみで小物計器を作るのですが、様々に役立つツールです。

    重ねてありがとうございました。

    • mgo-tec mgo-tec より:

      haigaさん

      なるほど、そういうことだったんですね。
      そういえば、ExcellのVBAはShift_JISでしたね。
      Windows10もそこは文字コード選択できるようにして欲しいですね。

      とりあえず、無事動いて良かったです。
      (^^)

タイトルとURLをコピーしました