👏

GoogleAppsScript(GAS)でUTF-8-Mac(NFD)に対応する

2022/08/14に公開約2,200字

UTF-8-Mac(NFD)とは

Macのファイルシステムで使われてる文字コードで、通常のUTF-8(NFC)とは違い濁音と半濁音の文字が2文字扱いになります。例えばMacでパパ活 (1).jpgという名前の画像ファイルがあった場合、ファイル名をコピーしてエディタに貼りつけて、文字を消していくと「パ」を消すと「゚」の半濁点だけが消えて「ハ」になります。(※エディタによっては勝手にUTF-8に変換してくれるので2文字にならないパターンもあります。VSCodeだと2文字になります。)
詳しく説明するとUTF-8では「パ」は文字コードU+30D1ですが、UTF-8-Macでは「ハ」の文字コードU+30CFと「゚」の半濁点の文字コードU+309Aの2つを組み合わせて「パ」の文字が作られています。
これの何が問題かというと、例えばMacからGoogleドライブにアップロードしたファイルはファイル名がUTF-8-Macで保存されるため、GASで検索する場合はUTF-8で検索してもとヒットせず、UTF-8-Macで検索しないとヒットしません。(普通にWebの画面で検索する場合はどちらでもヒットします)

// UTF-8だとヒットしない
DriveApp.searchFiles('title contains "パパ活"') 

// UTF-8-Macで検索するとヒットする
DriveApp.searchFiles('title contains "パパ活"') 

Windowsの人とMacの人がいたり、システムによってUTF-8に強制変換されていたりすると、UTF-8とUTF-8-Macが混在して非常に困ります。しかもGASから提供されている文字コード変換メソッドsetDataFromString()ではcharsetにUTF-8-Macは対応していません。

https://developers.google.com/apps-script/reference/base/blob#setdatafromstringstring,-charset
そこで文字列をUTF-8-Macに変換したり、UTF-8に変換するライブラリをGASで作成しました。

「UTF8Mac」ライブラリのインストール方法

GASの画面で「ライブラリ」の+ボタンから下記のスクリプトIDを検索して追加してください。UTF8Macというライブラリが追加されます。
スクリプトID: 137Q2nSqetjeZF6GVJX_NtB4ylenlemmaWGsDoIzGWmW6q9MW_yA2NvzE

メソッド

toNFD(text)

文字列をUTF-8-Mac(NFD)に変換します。

  UTF8Mac.toNFD('パパ活')  // return パパ活 ← UTF-8-Mac(NFD)

toNFC(text)

文字列をUTF-8(NFC)に変換します。

  UTF8Mac.toNFC('パパ活')  // return パパ活 ← UTF-8(NFC)

hasNFD(text)

文字列にUTF-8-Mac(NFD)が含まれてるかどうか真偽値を返します。

  UTF8Mac.hasNFD('パパ活')  // return true
  
  UTF8Mac.hasNFD('パパ活')  // return false

使い方サンプル

最初にあげた画像検索を例にすると、下記のように検索すればファイルさえ存在すればMacでアップしたファイルでもWindowsでアップしたファイルでも検索文字がUTF-8-Macであってもなくても必ずヒットするはずです。

const fileName = 'パパ活'
// とりあえず一度検索
let files = DriveApp.searchFiles(`title contains '${fileName}'`)
// ヒットしなかった場合
if (!files.hasNext()) {
  if (UTF8Mac.hasNFD(fileName)) {
    // UTF-8(NFC)で再検索
    files = DriveApp.searchFiles(`title contains '${UTF8Mac.toNFC(fileName)}'`)
  } else {
    // UTF-8-Mac(NFD)で再検索
    files = DriveApp.searchFiles(`title contains '${UTF8Mac.toNFD(fileName)}'`)
  }
}

ソースコード

https://script.google.com/u/0/home/projects/137Q2nSqetjeZF6GVJX_NtB4ylenlemmaWGsDoIzGWmW6q9MW_yA2NvzE/edit

まとめ

Shift-JISは嫌いだったけどUTF-8-Macも嫌いになりました。
GASはいいぞ

Discussion

ログインするとコメントできます