法人番号公表サイトのWeb-APIを利用した法人情報の取得と文字の取扱い

本記事では、国税庁の法人番号公表サイトで提供されている法人番号システムWeb-APIを利用した法人情報の取得方法と、法人情報における文字の取扱いについて見ていきます。


[1]はじめに

国税庁の法人番号公表サイトでは、法人番号の指定を受けた者の基本3情報(1.商号又は名称、2.本店又は主たる事務所の所在地、3.法人番号)を公表しています。

このサイトでは、法人の検索、基本3情報のダウンロードに加えて、
  • 指定した法人番号や法人名で抽出した法人に係る情報、指定した期間及び地域で抽出した法人の更新(差分)情報を取得する
ことができる「法人番号システム Web-API」も提供しています。

法人番号とは、国税庁が指定する13桁の識別番号で、素人的にざっくり考えれば、個人に対するマイナンバーの法人版(法人を特定する番号)と考えると理解しやすいですが、マイナンバーと違って公開情報です。

法人番号の詳細については、上記サイトのほか、Wikipediaの説明も参考になります。

Wikipediaの説明を読むと、法人番号は、いわゆる登記された会社や法人だけでなく、国の機関や地方公共団体も指定されるようです。法人番号が割り当てられていれば、法人番号公表サイトで検索することができます。
(「衆議院」なども法人番号が割り振られているとは知りませんでした。実際、検索することができました。)

ところで、設立登記が行われるような法人に関しては、登記情報をもとにした情報提供が行われているようです。そうだとすると、私として技術的に興味深いのは、どのように登記情報の文字を扱っているかな?というところです。

具体的には、登記ではJISコードが割り当てられていない文字も扱う必要があり(よく外字登録して利用されるような文字など)、インターネットで情報提供を行う場合、このような文字をどのように扱うのかな?というところに興味があります。

今まで日本の文字コードの問題は国内問題のようなイメージがありましたが、世界的にDXが進み、政府もDXを推進する中で、日本語の文字の扱い方の方向性とか、そのヒントがあれば、と興味が湧きました。

本記事では、そんなことを考えながら(実はあまり考えてませんけど:笑)、法人番号公表サイトのWeb-APIをサンプルコードを中心にざっと概観すると同時に、文字の取扱いについても簡単に見ていきます。

[2]法人番号システム Web-API利用の準備

法人番号公表サイトでは、利用登録などの手続きを行わなくても、名称や所在地、法人番号で検索したり、基本3情報のCSVファイルをダウンロードしたりすることができます。

しかし、Web-APIを利用する場合は、利用規約に同意して、アプリケーションIDの発行手続を行う必要があります。(Web-APIの利用時にはアプリケーションIDが必要となります。)

アプリケーションIDの発行手続きやWeb-APIの利用は無料です。
また、法人担当者に限らず、個人利用でも届け出ができるようです。

発行手続きは、上記サイトからオンラインまたは書面が選択できますが、どちらで行っても郵送で「アプリケーションIDのお知らせ」が届きます(一週間程度とされています)。

Web-APIの仕様については、上記サイトに丁寧な仕様書が公開されています。(仕様書は発行手続きを行わなくても見ることができます。)

加えて、ダウンロードのページにもリソース定義書などの参考になる情報が記載されています。

なお、利用上の注意点として、Web-API機能を使用したサービスを公開される場合には、
  • このサービスは、国税庁法人番号システムのWeb-API機能を利用して取得した情報をもとに作成しているが、サービスの内容は国税庁によって保証されたものではない
ということを、どこかに明示してください、とのことです。

[3]Web-APIの利用サンプルコード

アプリケーションIDが送られてきたら、Web-APIを利用することができます。

Web-APIを利用すると、法人番号から検索、期間を指定して検索、法人名を指定して検索など、いくつかの利用ケースに応じて利用できるようです。

本記事では、Web-APIの雰囲気を知るために、もっとも単純な法人番号から検索するパターンで試してみることにします。
(結果が一意に定まるので、サンプルコードが簡単になるのが一番の理由ですが、複雑な検索を行うなら、Web-APIより、CSVファイルをダウンロードして検索処理を行う方が実用的な気がしたのも理由の一つです。)

実用的なシナリオはともかく、早速サンプルコードをもとに利用してみることにします。

APIの仕様はとてもシンプルなので、どの言語でも簡単に実装できますが、今回はPythonで実装してみました。

(参考)
下記コードは、Google Colaboratory のノートブックに以下のコードを張り付けて実行すると、環境構築も不要で、簡単に試すことができます。

import re
import urllib.request
import io
import csv

def search_by_hojinbango_sample(appid,hojinbango,jis2=False):
    """法人番号から法人情報を取得する関数サンプル
        Args:
            appid: Web-APIを利用するためのアプリケーションID(13桁)
            hojinbango: 法人番号(半角数字13桁)
            jis2: Trueのとき、文字をJIS 第一・第二水準の範囲で取得。
                 Falseのとき、文字をJIS 第一水準から第四水準の範囲で取得。
        Returns:
            法人情報のディクショナリ
    """

    # パラメータチェック
    if re.fullmatch("\\w{13}",appid) is None:
        raise Exception("13桁(半角英数字)のアプリケーションIDを指定してください")
    if re.fullmatch("\\d{13}",hojinbango) is None:
        raise Exception("13桁(半角数字)の法人番号を指定してください")
    # 応答形式:
    #   01=>CSV 形式/Shift-JIS(JIS 第一・第二水準)
    #   02=>CSV 形式/Unicode(JIS 第一水準から第四水準)
    res_type = '01' if jis2 else '02'
    # URL作成
    # version=4,id=アプリケーションID,number=法人番号,type=応答形式
    requrl = "https://api.houjin-bangou.nta.go.jp/4/num?id={}&number={}&type={}&history=0".format(
        appid,hojinbango,res_type
    )

    # 送信+結果の処理
    with urllib.request.urlopen(requrl) as response:
        # 応答形式に応じて戻りデータをデコードする
        res_data = response.read()
        enc = "shift_jis" if jis2 else "utf-8"
        content = res_data.decode(enc)

        # csvリーダで解析
        with io.StringIO(content) as sio:
            rd = csv.reader(sio)
            # 1行目は、本サンプルではスキップ
            header = next(rd)
            # 2行目は法人情報なので、ディクショナリとして返却
            info = next(rd)
            return {
                '一連番号': info[0],
                '法人番号': info[1],
                '処理区分': info[2],
                '訂正区分': info[3],
                '更新年月日': info[4],
                '変更年月日': info[5],
                '商号又は名称': info[6],
                '商号又は名称イメージID': info[7],
                '法人種別': info[8],
                '国内所在地(都道府県)': info[9],
                '国内所在地(市区町村)': info[10],
                '国内所在地(丁目番地等)': info[11],
                '国内所在地イメージID': info[12],
                '都道府県コード': info[13],
                '市区町村コード': info[14],
                '郵便番号': info[15],
                '国外所在地': info[16],
                '国外所在地イメージID': info[17],
                '登記記録の閉鎖等年月日': info[18],
                '登記記録の閉鎖等の事由': info[19],
                '承継先法人番号': info[20],
                '変更事由の詳細': info[21],
                '法人番号指定年月日': info[22],
                '最新履歴': info[23],
                '商号又は名称(英語表記)': info[24],
                '国内所在地(都道府県)(英語表記)': info[25],
                '国内所在地(市区町村丁目番地等)(英語表記)': info[26],
                '国外所在地(英語表記)': info[27],
                'フリガナ': info[28],
                '検索対象除外': info[29]
            }

def print_hojinjoho_sample(appid,hojinbango,jis2=False):
    # 法人番号から法人情報を取得
    info = search_by_hojinbango_sample(appid,hojinbango,jis2)
    # 取得した情報を表示
    for k in info:
        print("{}:{}".format(k,info[k]))

URLの仕様や戻りデータの詳細については仕様書を参照して頂くとして、ここで少し補足しておきます。
  • 現時点でAPIのバージョンは1,2,3,4とありますが、上記では4を指定しています(4は1,2,3の内容を含んでいますので)。
  • 応答形式は、CSVとXMLが指定できますが、上記ではCSVを指定しています。理由は、今回の目的である文字の範囲を指定できるからです。
    • 引数jis2にTrueを指定するとJIS 第一・第二水準の範囲の文字表現(Shift-JISでエンコード)となり、Falseを指定すると、第一水準から第四水準の範囲での文字表現(UTF-8でエンコード)となります。
  • 戻りデータはCSV形式で、かつ上記サンプルは1件のみの検索を行っていますので、ここでは簡単のため1行目のヘッダを無視して、法人情報が入る2行目のみ取り出しています。
    • なお、APIの仕様としては一度に複数の法人番号を指定することができます。
  • 戻りデータの内容は、基本的にはダウンロードするCSVファイルのレコード項目と同じです。(詳細はリソース定義書を参照して下さい。)

さて、上記コードを以下のように呼び出すと、取得した法人情報が表示されます。
print_hojinjoho_sample("アプリケーションID","法人番号")

ここで、アプリケーションIDは通知された番号を指定します。法人番号は、例えば法人番号公表サイトで検索して調べておきます。

なお、上記例では、法人情報をJIS第1~4水準の文字範囲で取得します。

JIS第1~2水準の文字範囲で法人情報を取得する場合は、jis2引数にTrueを指定します。
print_hojinjoho_sample("アプリケーションID","法人番号", True)

Web-APIの応答速度はかなり良いです!

ところで、今どきJIS第1~2水準の文字範囲に限定して情報を取得する必要があるのか?という素朴な疑問があるかもしれません。

これは、古いシステムを利用している場合や、行政への申請等においては第1~2水準の文字に限定されているシステムもありますので、案外重宝します。(実際には、JIS第3~4水準の文字コードを扱えても、フォントなどの問題で表示できない、という残念な場合もありますので、そのような場合にも重宝するかもしれません。)

実は登記情報にはJIS規格以外の文字も多く利用されており、これをJIS規格文字の範囲内にマッピングしているわけですが、この内容については後述の「文字の取扱い」で書きます。

さて、会社の情報を調べるのが一般的な利用目的かと思いますが、Wikipediaで政府系や地方自治体も法人番号が割り当てられているという事なので、今回はこちらを見てみることにします(笑)。

まず、法人番号検索サイトで「商号または名称」に以下の内容を入力して法人番号を調べてみると、確かにあります。例えば、
  • 衆議院=>5000011000001
  • 参議院=>4000011000002
  • 内閣府=>2000012010019
  • 東京都=>8000020130001
    • 東京都を名称に含む法人は多いようなので、「法人種別などその他の条件を開く」をクリックして、「地方公共団体」にチェックを入れると絞り込みが効きます。

これらの法人番号を指定して実行すると、情報が得られます。

色々と試してみると面白いのですが、話がそれすぎるので、Web-APIはここまでとします。


[4]文字の取扱い

はじめから情けないお断りで大変恐縮ですが、私は正直言って文字について深い知識や理解がありませんので、深遠な日本語文字世界の扱いについて語ることはできません(涙)。

ここでは、以下のページにある「文字の取扱い」、「JIS縮退マップについて」の項などに記載されている内容をもとに、私の理解の範囲で書きます(誤解や認識不足もあるかもしれませんので、下記ページもあわせてご参照ください)。

法人番号公表サイトでの文字の取扱いは以下のように説明されています。
  • 法人の商号及び所在地には、JIS第一・第二水準以外の文字が使用されている場合があります。 このサイトでは、利用者のシステムで二次活用が容易にできるよう、該当する文字をJIS第一~第四水準の文字及びJIS第一・第二水準の文字に縮退し、データを提供しています。

この関係をざっくり図にしてみました(上記サイトにある「法人番号システムにおける文字コードについて」の図を参考にしています)。

文字の縮退処理

元になる法人の商号及び所在地の文字空間は登記統一文字で、これをJIS第1~4水準あるいはJIS第1~2水準の文字空間に縮退して利用します。

ここで、縮退とは、ざっくり言えば、変換表(マップ)をもとに代替え文字などを割り当てて、大きな文字セットを小さな文字セット内で表現することだと理解しています。(この変換の考え方や変換表はかなり奥深いです。。。)

法人番号公表サイトでは、上図のように、2段階の縮退が行われるようです。
  • 登記統一文字からJIS第1~4水準漢字への縮退
  • JIS第1~4水準漢字からJIS第1~2水準漢字への縮退
  • 縮退先がない文字は、「_(アンダーバー)」に置き換えられます。

Web-APIやダウンロードファイルは、JIS第1~4水準漢字とJIS第1~2水準漢字を選択することができます。(先のWeb-APIのサンプルでは、jis2引数で制御しています。)

一方、Webサイトを利用した検索結果表示は、JIS第1~2水準漢字で表示されるようです。
但し、JIS第1~2水準漢字以外の文字を含んでいる場合は、検索結果に「外字」ボタンが表示されますので、この「外字」ボタンをクリックすると、登記記録等における表記が画像で表示されます。
(なお、画像は名称や所在の文字列全体の画像であり、特定文字の字形画像ではありません。)

この画像は、Web-APIを利用した場合やダウンロードファイルを利用する場合も利用できます。
先のサンプルコードの戻りデータには「商号又は名称イメージID」、「国内所在地イメージID」、「国外所在地イメージID」という項目があります。
これは、それぞれ「商号又は名称」、「国内所在地」、「国外所在地」に、JIS第1~2水準漢字以外の文字を含んでいる場合に設定されるイメージIDです。

このイメージIDを利用して、以下の外字確認用URLにアクセスすると画像を得ることができます。
https://www.houjin-bangou.nta.go.jp/image?imageid=イメージID


縮退の例を二つほど書いてみます。

<縮退先がない文字の例>

縮退先がない文字は、「_(アンダーバー)」に縮退されるという事なので、法人番号公表サイトの検索画面の「商号又は名称」欄に「_」(アンダーバーの文字)を入力して検索してみました。すると、多くの法人が表示されます。そして、「外字」ボタンが表示されますので、正字の商号又は名称を画像で確認できます。

これらの法人情報をWeb-APIを利用して情報を取得してみると、「商号又は名称イメージID」に値が設定されていますので、外字確認用URLを通じて画像が取得できます。

<「髙」の例>

漢字に詳しくない私でもよく耳にする例として、俗に「はしご高」といわれる「髙」(「高」の異体字)があります。
(注意)端末によっては、「髙」が表示されていないかもしれません。


百貨店の「髙島屋」で有名な字です(笑)。
  • https://www.takashimaya.co.jp/corp/
    • 気になってホームページを見ると、デザイン的な考慮もあるとは思いつつも、「髙島屋」を画像なり「タカシマヤ」とか「TAKASHIMAYA」と表現するなど、「高島屋」という縮退表現がなかなか出てこないところに、うまい作りだなーと感心しました(笑)。
    • とはいいつつ、各店舗レベルで見ると、「高島屋」という縮退表現も出てきます。現実には、表示だけでなく、検索なども考えると縮退表現も考慮する必要もありそうなので、文字の扱いはとても難しいなーと実感するところです。

Web-APIを利用してみると、JIS第1~2水準あるいはJIS第1~4水準のどちらを指定しても、商号又は名称は「株式会社高島屋」となって、JIS第1~2水準に縮退しています。ただし、「商号又は名称イメージID」は設定されていますので、正字を画像で見ることができます。

これは、IBM拡張文字には定義されていても、JIS第1~4水準に割り当てが無いので、MJ縮退が行われた結果という事でしょうか。

以上、文字については理解が薄いのに書きすぎた感じがしますが、時間をかけて勉強して、もう少しマシなことが書けるようになりたい、と気づいたことが自分にとって一番の収穫だったかも。。。

(参考: 2023/1/30追記)
記事『文字の図形とコードの関係を調べる』を書きました。

コメント

このブログの人気の投稿

マイナンバーカードの電子証明書(公的個人認証サービス)にJava APIでアクセスする

Google Document AIで画像から表形式データを抽出する(Vision API OCRとの違い)

VirtualBoxのスナップショット機能