リンクをクリップボードにコピー
コピー完了
お世話になります。
Illustratorのスクリプトを作成しているのですが、アラートに出る、配列に追加した日本語が文字化けしてしまいます。
定型句は文字化けしないのですが、何が原因として考えられるでしょうか。
ご存知の方、ぜひお知恵をお貸しください。
作業環境:
Illustrator2020(日本語版)
MacOS10.14.6
---問題のスクリプト------------------------
var nonMatchingFiles = []; // 条件を満たさないファイル名を格納する配列
〜〜〜
// 条件を満たさない場合、ファイル名を配列に追加
nonMatchingFiles.push(placedItem.file.name);
〜〜〜
// 条件を満たさないファイル名が格納された配列を確認して、空でなければアラートで表示
if (nonMatchingFiles.length > 0) {
alert("条件を満たさないファイル: \n" + nonMatchingFiles.join("\n"));
return; // 処理を終了
}
------------------------------------------
試したこと
●UTF-8 のBOMなしBOM付きで保存しなおし
●別のテキストエディタを使ってスクリプトを開き、UTF-8で再保存
●JavaScriptでの文字コード変換の試み
function escapeFileName(fileName) {
return unescape(encodeURIComponent(fileName));
}
var fileNameEscaped = escapeFileName(placedItem.file.name);
手元環境(macOS11.7.10)でファイル名「13_日本語1.ai」を配置して名前を取ってみたところ、
結果が異なりました。これは見慣れたやつですね。
これはdecodeURIで変換できました。
ご提示のスクショと比較すると、「%25」に違和感があるということで…
%25って「%」なんですね。
なので、コード全体を見ないと直接の原因はちょっとわかりませんが、
decodeURI() の二重がけで応急回避できるかと思います。
いまはMacでCatalina以降だとExtendScriotToolKitを使えないのでExtendScriptのDOMを調べるのにひと苦労なんですよね…
外部サイトですがこのあたり参考になりますね
ん、fullNameはフルパスが返りますよ。それで正常です。
そこから正規表現で切り出す方法というのもあります。
file.fullName.replace(/^.+\/(?=[^\/]+$)/, "")
などでも。
リンクをクリップボードにコピー
コピー完了
手元環境(macOS11.7.10)でファイル名「13_日本語1.ai」を配置して名前を取ってみたところ、
結果が異なりました。これは見慣れたやつですね。
これはdecodeURIで変換できました。
ご提示のスクショと比較すると、「%25」に違和感があるということで…
%25って「%」なんですね。
なので、コード全体を見ないと直接の原因はちょっとわかりませんが、
decodeURI() の二重がけで応急回避できるかと思います。
リンクをクリップボードにコピー
コピー完了
できました!ありがとうございます。根本的な解決が大事ではありますが、ひとまずこれで対応していきたいと思いまあす。
リンクをクリップボードにコピー
コピー完了
placedItem.fileプロパティはExtendScriptのFileオブジェクトを返します。
ですからFileオブジェクトのプロパティを調べればよいのです。
nameプロパティはURI表記のファイル名を返しますので、表示には適しません。
displayNameプロパティかfsNameプロパティであれば日本語がその通り取得できますので、単純にファイル名だけであればdisplayNameプロパティ、ファイルパス名も含めたければfsNameプロパティを使用してください。
リンクをクリップボードにコピー
コピー完了
いまはMacでCatalina以降だとExtendScriotToolKitを使えないのでExtendScriptのDOMを調べるのにひと苦労なんですよね…
外部サイトですがこのあたり参考になりますね
リンクをクリップボードにコピー
コピー完了
var fileOBJ = app.activeDocument.placedItems[0].file;
alert(fileOBJ.name);
alert(decodeURI(fileOBJ.name));
alert(fileOBJ.displayName);
alert(fileOBJ.fsName);
displayNameは空文字が返ってきました。
やはりnameをdecodeURIするのが落とし所かなぁ。
リンクをクリップボードにコピー
コピー完了
Omachi様
ajabon grinsmith様
monokano様
ご回答ありがとうございます。
monokano様がおっしゃっておられるように、displayNameは、試したところ、空文字が返ってきました。
fsNameは、表示されることはされましたが、今のところファイルパスまで必要ないので悩ましいところ。
ajabon grinsmith様が提示してくださったリンク先の「fullNameプロパティ」だと、問題なく表示することができました。
細かいところの理解は追々していくとして(汗)、本当に助かりました!
皆様ありがとうございました!
リンクをクリップボードにコピー
コピー完了
fullNameプロパティでできたと思ったのですが、今日動かしたら、当たり前ですがパスまで表示されました。何が起きてたのかちょっとわかりませんが、教えてくださった、decodeURIを使用したいと思います。
リンクをクリップボードにコピー
コピー完了
ん、fullNameはフルパスが返りますよ。それで正常です。
そこから正規表現で切り出す方法というのもあります。
file.fullName.replace(/^.+\/(?=[^\/]+$)/, "")
などでも。
リンクをクリップボードにコピー
コピー完了
ご回答ありがとうございます。
色々なやり方があるのですね。ちょうど色々触ってたら教えていただいていたdecodeURIが効かない箇所があったので、file.fullName.replace(/^.+\/(?=[^\/]+$)/, "")を試すといけました。
本当にありがとうございます。