記事 Hiroshi Sato · 4月 1 1m read

IRISから外部のWebAPIを呼び出したとき、レスポンス内の全角文字が化ける

これは InterSystems FAQ サイトの記事です。

Content-Typeにcharset 情報が含まれていない場合、IRIS/Cachéは文字コードを判断できず文字コード変換が行われません。

そこで、以下のように、「自動的な文字変換を行わず、UTF-8に変換する処理を記述」することで、その指定がある無しに関わらず、対応することができます。
 

// requestオブジェクトは以下のように生成 // 詳細処理は省略// set request=##class(%Net.HttpRequest).%New()// リクエスト時に、文字変換を行わないように指定set request.ReadRawMode=1do request.Send("POST",URL)

 // 受取ったデータを、UTF-8に変換してから、JSON変換set response = request.HttpResponse.Data
 set data = response.Read()
 set data2 = $zcvt(data,"I","UTF8")
 set response = {}.%FromJSON(data2)
 write response.%ToJSON()

長い文字列が想定される場合には、一度のReadで読み込めない可能性があるため、以下のようなコーディングを行う必要があります。

set stream=##class(%Stream.TmpCharacter).%New()

 while 'response.AtEnd {
   set data = response.Read()
   set data2 = $zcvt(data,"I","UTF8")
   do stream.Write(data2)
 }

 set res = {}.%FromJSON(stream)
 write res.%ToJSON()