single.php

Chrome 拡張機能の Native Message で日本語文字列を受け渡す方法

Google Chromeの拡張機能で外部プログラムを実行するNative Messageでパラメータとして日本語を受け渡す際に文字化けを引き起こす場合の対処法を備忘録的に投稿しておきます。

Native Messageで引数を受け渡し

Chrome 拡張機能で外部プログラムを実行する[sendNativeMessage]でパラメータとして受け渡す値に日本語が入っている場合に外部プログラムで文字化けを引き起こす場合があります。

例えば、Chromeの拡張機能で次のコードを実行して JSON形式で、param1(英数字)、param2(日本語)の2つの値を送信します。

  var str = "日本語";
  
  chrome.runtime.sendNativeMessage(
    'native.message.sample',
    {param1:'Hello', param2: str},
    errorHandle(function(response, thread){
      console.log(response);
      return true;
    }
  ));

外部プログラム(例はC#)で、起動時に受け渡された値を取得します。

string data = GetData();
Dictionary<string, string> dict = JsonSerializer.Deserialize<Dictionary<string, string>>(data);

foreach (string key in dict.Keys)
{
    string value = dict[key];

    MessageBox.Show("名前: " + key + " 値: " + value);
}

static string GetData()
{
    var openstdinput = Console.OpenStandardInput();
    var length = 0;
    var lengthBytes = new byte[4];
    openstdinput.Read(lengthBytes, 0, 4);
    length = BitConverter.ToInt32(lengthBytes, 0);

    string result = "";
    for (int i = 0; i < length; i++)
    {
        result += (char)openstdinput.ReadByte();
    }
    openstdinput.Close();
    return result;
}

param1で送信された英語は、正しく受け取れます。

しかし、param2の日本語は文字化けしてしまいます。

日本語の文字化けを回避する方法

URLエンコードを利用して、sendNativeMessageで受け渡す日本語の文字化けを回避できます。

具体的には次の手順で行います。

1.[background.json]を編集して送信する文字列を[encodeURIComponent]でURLエンコードします。

  var str = "日本語";
  str = encodeURIComponent(str);
  
  chrome.runtime.sendNativeMessage(
    'native.message.sample',
    {param1:'Hello', param2: str},
    errorHandle(function(response, thread){
      console.log(response);
      return true;
    }
  ));

2. 外部プログラム側で受信した文字列を確認するとエンコードされています。

3. 外部プログラムではURLデコード[System.Web.HttpUtility.UrlDecode]で複合化します。

foreach (string key in dict.Keys)
{
    string value = System.Web.HttpUtility.UrlDecode(dict[key]);

    MessageBox.Show("名前: " + key + " 値: " + value);
}

4. 日本語の文字化けを回避ができました。

まとめ

今回は、Google Chromeの拡張機能で外部プログラムを実行するNative Messageでパラメータとして日本語を受け渡す際に文字化けを引き起こす場合の対処法について書きました。

文字列を[sendNativeMessage]で、そのまま送信すると受信側のプログラムで文字化けを引き起こす可能性があります。

URLエンコード・デコードを追加して、日本語を含む文字列を[sendNativeMessage]で送受信が可能です。

Google Chromeの拡張機能で外部プログラムを実行するNative Messageで、日本語が文字化けする人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただきありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です