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 文字列でも問題ないようです。
1 2 3 4 5 6 7 | #!/usr/bin/osascript -l JavaScript let jp = $( 'スズキ GSX250R' ).UTF8String; console.log (jp); //=> スズキ GSX250R // ex: ft=js.jxa |
ということで JXA にて簡単に調べるコマンドを作ってみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/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 の型と等価なので超簡単。
他の言語を使うのが馬鹿馬鹿しくなってしまうので注意が必要。
1 2 3 4 5 6 7 8 9 10 11 12 | #!/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