kintone.proxy で 取得するデータが文字化けする

何を実現したいのかを書きましょう

kintone.proxy にて、国税局のAPIにアクセスしてデータを取得して利用したい

発生した問題やエラーメッセージを具体的に書きましょう

取得した csvデータ(body)が 文字化けする

実行したコードをコピー&ペーストしましょう

// APIのURLを組み立てる
const apiUrl = https://api.houjin-bangou.nta.go.jp/4/name?id=******&name=${encodedCompanyName}&change=1&type=01;

const { body, status } = await new Promise((resolve, reject) => {
kintone.proxy(apiUrl, ‘GET’, {}, {}, (body, status, headers) => {
// バイナリデータをUint8Arrayに変換
const uint8Array = new Uint8Array([…body].map(c => c.charCodeAt(0)));
// Shift-JISでデコード
const decoder = new TextDecoder(‘shift-jis’);
const decodedBody = decoder.decode(uint8Array);

resolve({ body: decodedBody, status });

}, (error) => {
reject(error);
});
});

kintone.proxyにて、URLを投げると、bodyに値が帰って来るが、日本語の部分が文字化けをしてしまい、デコードをしても変わらず文字化けのままとなる

返却された body の内容は以下の通りだが、URLをブラウザで叩いてダウンロードされたcsvは、正しく日本語で取得できる。(テキストエディタでみると、shift-jisとなっている)

“2024-07-10,2,1,1\r\n1,9030002001480,01,1,2021-05-18,2015-10-05,"�L����\b�3",302,"���","�������\u000es�k��","���,���Q���4�T�R�\u0002P��",11,102,3310814,2015-10-05,0,"�C��_�C�Q��\",0\r\n2,9030002001480,12,1,2021-05-18,2021-05-10,\"�L����\b�3\",,302,\"���\",\"�������\u000es�k��\",\"�g�ャ�Q���1�W�W�\u0012n�W\",,11,102,3310811,,,,,,,2015-10-05,1,,,,,\"�C��_�C�Q��",0\r\n”

「いいね!」 1

encoding.js とか使ってみるとかいかがでしょうか!?

質問者のコードを整形

コードブロックの設定に失敗しており読みづらいので整形します

// APIのURLを組み立てる
const apiUrl = `https://api.houjin-bangou.nta.go.jp/4/name?id=******&name=${encodedCompanyName}&change=1&type=01`

const { body, status } = await new Promise((resolve, reject) => {
    kintone.proxy(apiUrl, 'GET', {}, {}, (body, status, headers) => {
        // バイナリデータをUint8Arrayに変換
        const uint8Array = new Uint8Array([...body].map(c => c.charCodeAt(0)));
        // Shift-JISでデコード
        const decoder = new TextDecoder('shift-jis');
        const decodedBody = decoder.decode(uint8Array);

        resolve({ body: decodedBody, status });
    }, (error) => {
        reject(error);
    });
});

encoding.jsを使ってみる

うまくいきませんでした。

回避策

法人番号APIの仕様
https://www.houjin-bangou.nta.go.jp/pc/webapi/images/k-web-api-kinou-gaiyo.pdf#page=25
を参考にAPIにアクセスをするURLのtypeを01(CSV/Shift-JIS)から02(CSV/UNICODE)か12(XML/UNICODE)に変更してUNICODEで受け取るようにしてください。
XMLの方が受け取った情報を処理しやすいと思います。
どうしてもShift-JISで処理したい場合は、kintone内にいったん取り込んでから文字コードを変換して対応する必要がありそうです。

外部のAPIを実行する - cybozu developer network

には記載がないようですが、外部APIからのデータ返却の文字コードがShift-JISなどのutf8以外だと無条件にデータ変換か何かが行われデータが壊れてしまうようです。

たとえば、kintone.proxy()が関連しないGoogle App Scriptでは
type 01のShift-JISで問題なく受け取れます。

function getCorporatenumber() {
  'use strict'
  const appId = '';
  const encodedCompanyName = encodeURIComponent("一代元")
  const url = `https://api.houjin-bangou.nta.go.jp/4/name?id=${appId}&name=${encodedCompanyName}&mode=1&type=01`;

  const response = UrlFetchApp.fetch(url).getContentText("Shift-JIS")
  
  console.log(response)
}

もし、kintone.proxy()が文字コードを変換しているのであれば、Shift-JISに直せばいいのではないか?と考えました。
しかし、うまくいかず

Encoding.stringToCode()

の時点で

 [72, 101, 108, 108, 111, 32, 65533, 111, 65533, 974, 89, 65533, 399, 65533, 33]

のように65533が含まれており、Unicodeの置換文字になっており直せませんでした。

「いいね!」 2

有難うございます!文字コードを、2(CSV/UNICODE) にすることで万事解決しました。

「いいね!」 1

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。