[ 掲示板に戻る ]

記事No.10633に関するスレッドです

Unicodeの“結合文字列”? / ぶぶまる
■環境
OS:macOS 14.7.1
バージョン:InDesign CC2024

遅ればせながら
Visual Studio Code + ExtendScript Debuggerを導入し
InDesignのスプリプトを勉強しています。

■質問内容
「InDesignのファイル名と、テキストファイルに書かれたファイル名とが一致すれば」というスクリプトを書いています。
InDesignのファイル名は「Script_タイプ.indd」としています。

テキストファイルは、docName.txtという名前で、A01_Script_タイプ.indd というテキストのみ記載で、
inddファイルと同じフォルダに入れてます。

InDesignのファイル名とテキストファイルから読み込んだ文字列同士は、見た目は同じですが、==演算子でfalseを返してきます。
ネットで検索すると「Unicodeの“結合文字列”という仕組みにより濁音/半濁音を別扱いしている」という記事を見つけました。確かに
myDoc.name で取得したファイル名「Script_タイプ.indd」の「プ」が「フ」と「。」の合成文字になっていました。

以下のスクリプトでテキストファイルの内容を読み込むようにしていますが、「プ」の扱い方をどうすればよいか悩んでいます。
テキストファイルに書かれたファイル名と、InDesignのファイル名とが==演算子でtrueになる方法はあるでしょうか?
的外れな質問でしたら申し訳ございませんが、
お知恵をお貸しいただけたら幸いです。よろしくお願いします。

///////////////
var path = "/Users/Desktop/名称未設定フォルダ/docName.txt";
var myDoc = app.activeDocument;

var fObj = File(path);
var txtArr = new Array();
fObj.open("r");

while(!fObj.eof) {
txtArr.push(fObj.readln());
}
fObj.close();
////////////////

No.10633 2025/03/21(Fri) 09:30:30
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Safari/605.1.15

Re: Unicodeの“結合文字列”? / Uske_S URL
ぶぶまるさん、こんにちは!

勉強を始められたとのこと、大変だと思いますがぜひがんばってください!

さて、ご質問についてですが、おっしゃるとおり、Mac環境では濁点・半濁点がそれぞれ別の文字になってしまいます。

……とその前に、ユーザーフォルダはそのパス指定では取得できないはずです。
例文として書かれているのでしたら無視していただいて大丈夫ですが、ユーザーフォルダを指定するには「~」が使えます。

"~/Desktop/名称未設定フォルダ/docName.txt";

みたいな形になります。

……で、本題ですが、これは結構厄介な問題で、直接的な解決方法がなく、他のアプローチを検討する必要があります。

1. そもそもファイル名に和文を入れない
2. docName.txtにドキュメント名を書き込む際もスクリプトから書き込む
3. 1も2も難しい場合、結合される(正規化)前の文字列を一度全部手動で結合してから、ファイル名を比較する

こんな感じで伝わるでしょうか?

No.10634 2025/03/21(Fri) 15:09:04
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36

Re: Unicodeの“結合文字列”? / Uske_S URL
すみません、

"/Users/Desktop/名称未設定フォルダ/docName.txt";

で取得できました^^;;;

No.10635 2025/03/21(Fri) 15:10:35
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36

Re: Unicodeの“結合文字列”? / お〜まち URL
文字列とファイル名を比較すると必ずこの問題に引っ掛かるので、面倒でもファイル名同士で比較したらどうでしょう。

まず比較前にチェック用のフォルダを作成します。
チェック用のフォルダ内に、テキストファイル中のファイル名でファイルを作成します(中身はカラでいいです)。
作成したファイルの名前と、実際に存在するファイルの名前を比較するわけです。
最後にチェック用にフォルダを中のファイルを含めて削除します。

なお、思いついただけで実際に試したわけではないので(私はWindowsなので)、Macの方々よろしくお願いします。

No.10636 2025/03/21(Fri) 16:26:21
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36

Re: Unicodeの“結合文字列”? / ぶぶまる
Uske_Sさま
お〜まち さま

お返事ありがとうございます。

Uske_Sさまにご教授いただいた2番目のアプローチ案を試してみました。
docName.txtからファイル名を読み込み、
読み込んだファイル名をdocName.txtに上書きして、
さらにdocName.txtからファイル名を読み込んでみましたが、
“結合文字列”のファイル名になりませんでした。。。

お〜まちさまにご提案していただいたアプローチ案ですが、
なんとかスクリプトを書けそうな気がします。
いまから奮闘してみようと思います。

まずは、お知恵をお貸しいただき、ありがとうございました。

No.10637 2025/03/21(Fri) 21:18:25
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3.1 Safari/605.1.15

Re: Unicodeの“結合文字列”? / ぶぶまる
お〜まちさまにご提案していただいたアプローチ案でスクリプトを書いてみました。
フォルダの扱いで苦労しました。。。
ぜんぜんかっこよくないです。
今後の励みになりますので、かっこよくしてくだされば幸いです。

var myDoc = app.activeDocument;
//myDocのファイル名は"ぱぴぷぺぽ.indd"
//「ぱぴぷぺぽ」は結合文字列だったので。。。
//ちなみに myDocName.length は"15"です
var myDocName = myDoc.name;

//テキストファイルから読み込んだ文字列
var txtfileName = "ぱぴぷぺぽ.indd";

$.writeln(nameCheck(myDocName,txtfileName));

//myDocNameとtxtfileNameが同じがチェック。同じならtrue
function nameCheck(myDocName,txtfileName){

//デスクトップに「チェック用フォルダ」を作成したいのでデスクトップのパスを取得
var desktopPath = Folder.desktop.fsName;

//デスクトップに「チェック用フォルダ」を作成
var newFolder = new Folder(desktopPath + "/チェック用フォルダ");

if (!newFolder.exists) {
var createdFolder = newFolder.create();
} else {
alert("フォルダは既に存在します: " + newFolder.fsName);
exit();
}

// 新規ドキュメントを作成
var newDoc = app.documents.add();
// 新規ドキュメントの名前にテキストファイルから読み込んだ文字列を代入し、
//ドキュメントを「チェック用フォルダ」に保存
newDoc = newDoc.save(File("~/Desktop/チェック用フォルダ"+"/"+txtfileName));

var path = newDoc.fullName;

newDoc.close()//ファイルを閉じる

var newDoc2 = app.open(path);

var myFlag = (myDocName==newDoc2.name);

myMes(newDoc2.name);

newDoc2.close();

var fileList = newFolder.getFiles();

for(i=0; i<fileList.length; i++){
var DeleteFile = new File(fileList[i]);
DeleteFile.remove();
}

newFolder.remove();

return myFlag;
}

No.10638 2025/03/24(Mon) 16:46:56
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Safari/605.1.15

Re: Unicodeの“結合文字列”? / お〜まち URL
もう書いたんですか! 学習能力高いですね!
テキストファイル中のInDesignファイルを作成して「InDesignで認識しているファイル名の比較」をやっているわけですね。細かい点はおいといて、それもありです。

かっこよくしようとすると、いろいろ聞かなきゃいけなくて長くなるので、代わりに「Fileオブジェクト同士の比較」を置いておきます。これは空のファイルを作成しますが、InDesignでは開きません。参考になれば。

////////////////
var chkFolder = Folder(Folder.desktop.fsName + "/チェック用フォルダ");
if (chkFolder.exists) {
  alert("フォルダは既に存在します: " + chkFolder.fsName);
  exit();
}
chkFolder.create();

var txtFile = File(Folder.desktop.fsName + "/名称未設定フォルダ/docName.txt");
txtFile.open("r");
var chkFile = File(chkFolder.fsName + "/" + txtFile.readln());
txtFile.close();
chkFile.open("w");
chkFile.close();
var chkFileName = chkFolder.getFiles()[0].name; //作成したファイルの名前を改めて取得
chkFolder.getFiles()[0].remove();
chkFolder.remove();

var docFileName = app.activeDocument.fullName.name;
if (chkFileName === docFileName) {
  alert("一致しました");
} else {
  alert("一致しませんでした");
}
// 下から6行目
// app.activeDocument.fullName は開いているドキュメントのFileオブジェクトになります。そのnameプロパティを取得しています。

No.10639 2025/03/24(Mon) 23:00:59
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36

Re: Unicodeの“結合文字列”? / ぶぶまる
お〜まち さま

かっこいいバージョンありがとうございます!
InDesignでファイルを開かずに処理していく方法は、
思いも付かない方法だったので、非常に参考になります。

var chkFile = File(chkFolder.fsName + "/" + txtFile.readln()); の
txtFile.readln()
は、憧れる書き方です。

var chkFileName = chkFolder.getFiles()[0].name; や
app.activeDocument.fullName の
name プロパティのゲットの仕方は、
今回、教えていただなかったら、ぜったい思いつかないです。。。
いろいろ勉強になり、いろいろ試したいことも出てきました。

よくよく考えれば,非常にぜいたくなご指導をいただいた感じで、恐縮しています。。。
今回はありがとうございました、また機会があればよろしくお願いします。

No.10640 2025/03/25(Tue) 17:44:48
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Safari/605.1.15