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