ケーススタディ#6 – 禁則文字を含む文字列の登録(1/1)

本ケーススタディの概要

 NGSI V2では文字して格納できない文字(禁則文字)を定義しています。このケーススタディ#6では禁則文字を含むデータを登録する事例を紹介します。尚、禁則文字に対する処理はお使いのプログラムによって異なります。ご使用になるプログラムの仕様をご確認ください。

禁則文字に対する考え方

 NGSI V2では<>()など13種類の文字を禁則文字としていますが、CSVでもダブルクォート(“)やカンマ(,)など幾つかの文字が禁則文字になっていて、禁則文字が異なります。また、禁則文字になっている文字を使いたい場合の回避方法も異なっています。例えばCSVでダブルクォートを表現する場合は(“”)と二つ並べることでひとつのダブルクォートが記載されていると解釈します。これに対し、NGSI V2ではダブルクォートはURLエンコードと言う手法で変換して(%22)と表現します。この違いは、NGSI V2はOpenAPIとかWebAPIなどと呼ばれるインタフェースを使ってデータを授受するためです。WebAPIでやり取りできる文字はASCII文字(半角文字)だけですし、ASCII文字であっても記号の利用には制約があるためです。このため、NGSI V2もURLのルールに従い使える文字が限られているのです。

禁則文字をURLエンコードする

 URLエンコードとは禁則文字を%○○に置き換えるだけです。置き換えルールは禁則文字を参照してください。ケーススタディ#2ではctojというツールでCSVをJSONに変換しました。このツールでも禁則文字をURLエンコードできるのですが、ここではjtojというツールを使います。このツールはjsonファイルをマージしたり、バッチ格納の形式に加工したりできますが、URLエンコードも可能です。以下、URLエンコード前のJOSNとエンコード後の結果です。ついでにバッチ格納の形式にも変換してあります。

## URLエンコード前 ##

  [
--3件分省略 --
    {
      "id": "urn:ngsi-ld:Complaint:JP9000020342025-20240415-004",
      "type": "Complaint",
-- 中略 --
      "cause": {
        "type": "StructuredValue",
        "value": {
          "abstracts": "盗難・いたずら(故意)"
        }
      },
      "severityMark": {
        "type": "Text",
        "value": "C"
      }
    },
--5件目省略 --
  ]

## URLエンコード後 ##

{
  "actionType": "append",
  "entities": [
--3件分省略 --
    {
      "id": "urn:ngsi-ld:Complaint:JP9000020342025-20240415-004",
      "type": "Complaint",
-- 中略 --
      "cause": {
        "type": "StructuredValue",
        "value": {
          "abstracts": "盗難・いたずら%28故意%29"
        }
      },
      "severityMark": {
        "type": "Text",
        "value": "C"
      }
    },
--5件目省略 --
  ]
}

 JSONができたので、Fiware/Orionにこのままで格納してみましょう。処理系に依存する部分もありますが、恐らくこのままで格納できると思います。尚、筆者が確認した環境はWindowsのPCを二台用意して、片方でFiware/Orionを起動し、もう片方からPowerShell上のcurlコマンドでFiware/Orionに問い合わせています。

 次に、URLエンコードした値が入っている”cause”の”abstracts”の値に”盗難・いたずら%28故意%29″を指定して実際にFiware/Orionから読みだしてみましょう。ここで問題となるのはURLエンコードした”%”という文字自身が禁則文字であることです。従って、この”%”を再度URLエンコードします。因みに、日本語も使ってはいけない文字ですのでURLエンコードすべきなのですが、処理系によってはエラーとはならないようです。筆者の環境ではエラーとはなりませんでした。

## 問い合わせ条件の指定方法(全体をURLエンコード) ##

cause.abstracts==%E7%9B%97%E9%9B%A3%E3%83%BB%E3%81%84%E3%81%9F%E3%81%9A%E3%82%89%2528%E6%95%85%E6%84%8F%2529

## 問い合わせ条件の指定方法(%だけURLエンコード) ##

cause.abstracts==盗難・いたずら%2528故意%2529'

## 問い合わせの結果 ##

[{"id":"urn:ngsi-ld:Complaint:JP9000020342025-20240415-004","type":"Complaint","cause":{"abstracts":"盗難・いたずら%28故意%29"},"name":"吉中インターホン汚損","parts":{"abstracts":["呼出し設備"],"refComponent":"urn:ngsi-ld:Device:JP0990123456007-IX-1000-876D","remarks":"インターホン表面"},"phenomenon":{"category":["汚損"],"remarks":"マジック様の塗料付着"},"refBuilding":"urn:ngsi-ld:Building:JP9000020342025-04000008","severityMark":"C","status":"完了","timestamps":[{"step":"受 付","timestamp":"2024-04-15"},{"step":"報告","timestamp":"2024-04-20"},{"step":"処置","timestamp":"2024-04-15"}],"zones":{"abstracts":["屋外","正門"]}}]

この様にURLエンコードは何重にも繰り返す必要がある場合があります。実行環境に依存しますので、気を付ける必要があります。因みに、Fiware/Orionを起動したPCで%だけエンコードして実行するとエラーにはなりませんでしたが、1件も見つからない結果となりました。勿論、全体をエンコードするとOKでした。やはり、確認が必要ですね。