お世話になります。
文字化けについて回避方法を伺いたいです。
現在 PowerShell の Invoke-RestMethod を用いてアプリのJavaScriptファイルを更新しようとしています。
以下の3つのAPIを利用してファイルのアップロードと、カスタマイズへの紐づけ、運用環境への反映までは成功しています。
- ファイルアップロード: /k/v1/file.json
- JavaScript / CSSカスタマイズ設定変更: /k/v1/preview/app/customize.json
- 運用環境への反映: /k/v1/preview/app/deploy.json
アップロードしたファイルの中を確認すると日本語が ?? となってしまっています。
日本語文字列が入っているためURLエンコードをUTF-8とShift-JISで試しましたが
エンコードしたものがそのままファイルに入っているようです。
$fileUpUrl = 'https://{サブドメイン}.cybozu.com/k/v1/file.json'
$ID = "id"
$PASS = "password"
$b64enc=[Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes($ID+":"+$PASS))
$headers = @{'X-Cybozu-Authorization'=$b64enc}
$fileName = 'test.js'
$filePath = Get-Item -Path $fileName
$fileBytes = [System.IO.File]::ReadAllBytes($FilePath);
$fileEnc = [System.Text.Encoding]::GetEncoding('UTF-8').GetString($fileBytes);
$boundary = [System.Guid]::NewGuid().ToString();
$bodyLines = (
"--$boundary",
"Content-Disposition: form-data; name=`"file`"; filename=`"test.js`"",
"Content-Type: application/javascript",
"",
$fileEnc,
"--$boundary--"
) -join "`r`n"
$fileKeyRes=Invoke-RestMethod -Method Post -Uri $fileUpUrl -Headers $headers -ContentType "multipart/form-data; boundary=$boundary" -Body $bodyLines
$fileSetUrl = 'https://{サブドメイン}.cybozu.com/k/v1/preview/app/customize.json'
$fileKey = $fileKeyRes.fileKey
$app = 42
$custmizeParams = "{
""app"":""$app"",
""scope"":""ALL"",
""desktop"":{
""js"":[{""type"":""FILE"",""file"":{""fileKey"":""$fileKey""}}]
}
}"
Invoke-RestMethod -Method Put -Uri $fileSetUrl -Headers $headers -Body $custmizeParams -ContentType 'application/json'
$deployUrl = 'https:/{サブドメイン}.cybozu.com/k/v1/preview/app/deploy.json'
$deployParam = "{
""apps"":[
{
""app"":""$app"",
""revision"":-1
}
],
""revert"": false
}"
Invoke-RestMethod -Method Post -Uri $deployUrl -Headers $headers -Body $deployParam -ContentType 'application/json'
ファイル名を日本語にした際にURLエンコードを用いると表示上はURLエンコードしたままですが、手動でブラウザを利用してダウンロードするときには日本語のファイル名としてダウンロードされます。
URLエンコードは以下の方法でUTF-8とShift_JISで試しました。
現在開発者ライセンスの環境で開発をしています。
[System.Web.HttpUtility]::UrlEncode("あ")
[System.Web.HttpUtility]::UrlEncode("あ",[Text.Encoding]::GetEncoding("SHIFT-JIS"))