95590


Adobe
Acrobat用のJavaScriptを作成している最中なのですが、中国語文字をSJIS形式にうまく変換できず、変換不能な文字がすべて「?」に置き換わってしまうので何らかの対策案を探しています。

化ける文字例  
変換前：国际级  
変換後：国??

[code]

    //理想
    var str = "国际级";
    alert(str);
    
    >>国际级
    
    //現実
    var str = "国??";
    alert(str);
    
    >>国??
    
[/code]

スクリプト上ですでに化けているので出力結果も異常で当然なのですが、NotePad++やVSCode上でUTF8形式のファイルの上記テキスト類をSJISに変換すると、その段階ですでに「?」となります。

JavaScriptが対応している方法で化かさずに文字として認識させることは可能でしょうか。  
※Acrobat上のJSファイルの動作環境がHTML等のJSと異なる部分がありますが、とりあえず規制なくお伺いしたい次第です。

なお、Acrobat自体の通常の作業方法（編集＞高度な検索＞検索ボックスにUTF8形式の中国語文字の入力＞検索）では問題なく検索できており、検索ボックスのテキストはUTF8のまま動作していることを確認しています。

なのでなんらかのUTF8形式のまま取り込む方法があるのではないかと考えています。

2023/07/10 16:52追記  
多分下記のコードが実行できる環境（AcrobatのDCくらいの最新版帯）であればファイルが読み込める可能性がありそうでしたが、DCの環境で実行したところセキュリティ設定でブロックという新しいエラーに遭遇したので調査中。

[code]

    var fileStream = util.readFileIntoStream("C:/ ~ /TextFile.txt");
    var fileString = util.stringFromStream(fileStream, "utf-8");
    app.alert(fileString);
    
[/code]

2023/07/12 09:13追記  
コメントでいただいた

[code]

    var str = "国\u9645\u7EA7";
    
[/code]

で実行テストしたところ、  
Acrobat上の専用のAlertである

[code]

    app.alert("国\u9645\u7EA7");
    
[/code]

の記述では正常に画面に表示されることがわかりました。  
ただし、その先の目的の、Acrobat上で高度検索用の単語の入力をして検索を実行することができませんでした。

[code]

    app.addSubMenu(
        {
            cName: "AutoScript",
            cParent: "Edit",
            nPos: 0 
        }
    );
    
    app.addMenuItem(
        {
            cName: "Search Test",
            cParent: "AutoScript",
            nPos:0,
            cEnable:!1,
            cExec: "searchTest()"
        }
    );
    
    
    
    searchTest = app.trustedFunction(
        function (){
            try {
                
                //各種検索条件の設定
                search.wordMatching = "MatchAnyWord";   //単語の一致方法（語句、すべての語、いずれかの語、ブールクエリ）を指定します。
                search.matchWholeWord = false;          //完全に一致する語のみを検索します。
                search.matchCase = false;               //クエリで大文字と小文字を区別するかどうかを指定します。
                search.proximityRange = false;          //近似検索をする場合の、単語間のワード数を指定します。
                search.stem = false;                    //語幹を含む単語を検索します。
                search.bookmarks = false;               //文書のしおりを検索します。
                search.markup = false;                  //注釈を検索します。
                search.attachments = false;             //ベースとなる文書だけでなく、PDF 添付ファイルも検索します。
                
                //文言検索
                search.query("国\u9645\u7EA7","ActiveDoc");
                
            }
            catch(e){
                app.alert("Error Type : "+e.name + "\n" + "Error Number : " + e.lineNumber + "\n" + "Error Script File Name : " + e.fileName);
            }
        }
    );
    
[/code]

上記は本件のクリア後に実行する予定だったスクリプトです。  
search.query("国\u9645\u7EA7","ActiveDoc");  
の部分が本件で問題になった部分なのですが、alert()関数上で動作できれば動くだろうと考えおりましたが残念ながら同一の挙動を示してくれませんでした。

.jsファイルとして  
C:\Program Files (x86)\Adobe\Acrobat "バージョン番号"\Acrobat\Javascripts  
へ設置することでAcrobatウィンドウの編集メニューの一番上に新規メニューとして登録され、そこから高度検索モードを自動的に呼び出して実行するスクリプトです。

jsファイルをSJIS保存時はファイル内で取り扱える日本語文字はユニバーサル文字へ変換せずに検索フォームへ適用できました。

UTF保存時はそのままでは化けるのでユニバーサル文字の日本語（"最大" > "\u6700\u5927"）に変換することで正しく挿入・検索ができました。  
※そのまま入力すると検索フォームには「"最大" > "譛.螟ｧ"」と化けて入力されます。

このことから、Acrobatの専用関数search.query()ではSJIS以外受け付けられないのか？と考える次第です。


CC BY-SA 4.0
2023-07-10T03:17:48.550
95545
2023-07-13T09:59:32.640
2023-07-12T00:32:43.180
51823
51823
question
javascript 文字コード
SJIS形式のJavaScriptファイル上でUTF8形式の中国語文字を化かさず取り込む方法


色々検証したところ、残念ながら最終目標は達成できない可能性が非常に高いことがわかったので、できたところまでの結果を以下に書き残します。

できたこと：

[code]

    app.addSubMenu(
        {
            cName: "AutoScript",
            cParent: "Edit",
            nPos: 0 
        }
    );
    
    app.addMenuItem(
        {
            cName: "Search Test",
            cParent: "AutoScript",
            nPos:0,
            cEnable:!1,
            cExec: "searchTest()"
        }
    );
    
    
    
    searchTest = app.trustedFunction(
        function (){
            var fileStream = util.readFileIntoStream();
            var fileString = util.stringFromStream(fileStream, "utf-8");
            
            app.alert(fileString);//これは正常にディスプレイ上に表示される
        }
    );
    
[/code]

UTF8形式等の外部ファイルを読み込んで変数上に格納まではできました。  
コメント欄でご連絡いただいたリンク先のやり方を誤解しておりましたので正しいやり方がこちらです。  
実行環境はWin版の最新版のAcrobatのみ実行確認しております。  
手元の古いAcrobat9では全く機能しませんでした。（プロパティを調べてもそもそも存在しなかったので古い環境ではこのやり方ができないと判断しました）  
JSファイルをUTF8形式で保存しても正常に実行できるようになりました。

できなかったこと：

search.query(検索したい文字列,"ActiveDoc");  
searchのquery関数でPDF内のテキストから単語を含む箇所の検索を行いたかったが、引数に中国語文字などのUTF8形式の一部の文字が正常に渡せず、SJISに変換した場合と同様の文字化け（ピリオドにすべて置き換わる）をしてしまった。  
ユニバーサル文字に置き換えても現状なにをやっても手動で検索ウィンドウに挿入した場合を除いて検索ウィンドウで正しく文字を認識してくれませんでした。

以上のことから単純にUTF8形式の文字を扱うことはできましたが、特定の専用関数などではサポートされていない疑惑が強く、このカテゴリの開発が厳しいのかなと考えております。

できたけど正しいか不明瞭なこと：

JSファイルの作成にあたり、本来ならUTF8形式であるべきだが、UTF8形式でエンコードする場合、コメントなどの日本語テキストがすべて文字化けを起こした状態で実行される。

回避方法としてJSファイルをSJISでエンコードすることでコメントやapp.alert()などで表示する日本語がテキストそのままで保存・実行ができる。

このことからAcrobat用のJSファイルをエンコードする場合、2バイト文字が含まれる場合はSJISで最初からエンコードするべきなのかもしれない。

なお、ローカライズによる影響かもしれないので英語仕様のAcrobatの場合にこの限りではないかもしれないが、どの道英語版は日本語が使えないと考えて間違いないと思われる。

コメントいただいた皆様お手数をおかけして申し訳ございませんでした。  
ありがとうございました。


CC BY-SA 4.0
2023-07-12T05:45:14.640
95570
2023-07-12T07:27:29.540
2023-07-12T07:27:29.540
51823
51823
95545
answer


Adobe Acrobat Proを持っていないため、Adobe Acrobat Reader DCで検証しました。

## UTF-8のJavaScriptは使う方法

システムのエンコードをUTF-8に変更すれば、使えます。

UTF-8への変更方法 (副作用があるため自己責任で実施してください)

  1. Win + R キーを押し、「ファイル名を指定して実行」を起動します。

  2. `intl.cpl` と入力して「OK」を押し、「地域」のウインドウを表示させます。

  3. 「管理」タブに移動して「システム ロケールの変更」を押し、「地域の設定」のウインドウを表示させます。

  4. 「ベータ: おみワールドワイド言語サポートで Unicode UTF-8 を使用」にチェック入れ、「OK」を押し、再起動します。

※ この設定を実施した場合、一部の古いアプリケーションが文字化けする事があります。

これで、UTF-8のJavaScriptを使うことができますが、任意のUnicodeの文字を`\uXXXX`で表現可能ですので、ソースコードをUTF-8にしないとエンコード以外のUnicodeの文字が扱えないわけではありません。

この仕様についての詳しいドキュメントは見つけられませんでしたが、どうやら、ArobatがJavaScriptを読み込む際に、所謂 **ANSI**
として読み込むようです。このANSIとは、メモ帳(notepad.exe)で名前を付けて保存するときに、エンコードで選択できるANSIのことです。日本語環境ではCP932(Windows-31J、Shift_JISの亜種)になります。おそらく、Windows
10のあるバージョンまでは、メモ帳のデフォルトがANSIであったため、メモ帳でそのままJavaScriptを作れるようにしたのだと推測されます。これはWScriptのJScriptでも同じ仕様であり、一昔前のWindowsのアプリケーションではよくある仕様だったと考えられます。

## 中国語の文字を`search.query()`で使う方法

中国語版のAdobe Acrobat Reader
DCであれば、文字化けしませんでした。中国語で検索しいたい場合は、中国語版を使用してみてください。その時、表示設定は中国語にしてください。(英語ではダメです)

どうやら、`search.query()`は「アプリケーションを表示する言語」で指定された言語が持つ文字しか対応しないようです。日本語版のAdobe
Acrobat Reader
DCでも次回起動時選択で"English"を選べますが、そうすると「国」も"."に置き換わってしまいました。つまり、メニューが日本語であれば日本語だけ、中国語であれば中国語だけ、英語だけであれば英語だけ対応している動作のようです。

手動での検索は言語によらないので、この動作はAcrobatの不具合と言ってもいいと思います。サポートにバグ報告をしたら、そのうち直してくれるかも知れません。

* * *

他にも、Adobe
AcrobatのJavaScriptにはAdobe独自の仕様があるかも知れません。より詳細な仕様や回避策等はサポートへ問い合わせした方が良いでしょう。[アドビヘルプセンター](https://helpx.adobe.com/jp/support/support-
new/support-apps.html#acro)等もご利用ください。


CC BY-SA 4.0
2023-07-13T09:59:32.640
95590
2023-07-13T09:59:32.640
7347
95545
answer