Apple 関連で開発をしていると UTI を調べる必要がある場合が多々ある。
Uniform Type Identifier – Wikipedia
Uniform Type Identifier Concepts
検索をしていたら素敵なページを見つけた。
Mac や iOS でファイルの種類を表す識別子 Uniform Type Identifiers を拡張子から調べる(Swiftで1行で出来る) – niwatakoのはてなブログ
てゆーか JXA でも PyObjC でもできる。
しかし困ったことに JXA では CFString が NSString にキャストできない。
objective c – JXA: Accessing CFString constants from CoreServices – Stack Overflow
上記を見つけてようやく解決。
console.log って C 言語の char[] を出力できる、初めて知った。
UTF16LE に変換は不要、CJK 文字列でも問題ないようです。
#!/usr/bin/osascript -l JavaScript
let jp = $('スズキ GSX250R').UTF8String;
console.log(jp);
//=> スズキ GSX250R
// ex: ft=js.jxa
ということで JXA にて簡単に調べるコマンドを作ってみる。
#!/usr/bin/osascript -l JavaScript
ObjC.import('CoreServices');
function run(argv) {
for (let ext of argv) {
let uti = $.UTTypeCreatePreferredIdentifierForTag(
$.kUTTagClassFilenameExtension, $(ext), null);
let s = $.CFStringGetCStringPtr(uti, 0);
console.log(`${ext}: ${s}`);
}
}
// ex: ft=js.jxa
getuti.js
せっかくなので基底タイプも調べたいぞ。
JXA で得る方法が解らなかったので PyObjC で書いてみる。
PyObjC は CFDictionary や CFString も Python の型と等価なので超簡単。
他の言語を使うのが馬鹿馬鹿しくなってしまうので注意が必要。
#!/usr/bin/env python3
import sys, CoreServices
for ext in sys.argv[1:]:
uti = CoreServices.UTTypeCreatePreferredIdentifierForTag(
CoreServices.kUTTagClassFilenameExtension, ext, None)
arr = CoreServices.UTTypeCopyDeclaration(uti)['UTTypeConformsTo']
con = ','.join(arr)
print(f'{ext}: {uti} [{con}]')
# ex: ft=py
@PyObjC
getuti という拡張子の無い名前で +x のパーミッションを付けパスの通った場所へ。
JXA でやりたかったけどまだまだ修行が足りない。
注意: macOS 13 Ventura からは上記が使えません。
macOS: Get UTI (Ventura) | Paepoi Blog



