DTPオペレーターのInDesign、Javascript関連セーブデータ。ただいま過去記事の整理中のため、記事が突然消えたり現れたり、記事の内容が微妙に変わったりします。最近は主にTwitter(@subi_omu)で活動。
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
サロゲートペア文字その3 テキストエディタでサロゲートペア文字をコードポイント表記に変換
これの続きです。

テキストデータ中のサロゲートペア文字は、以前書いたとおり、正規表現検索置換機能で[\x{010000}-\x{10FFFF}]で探せます。

ですが、探した後どうするかというのが難しい。読みがわかって説明しやすい文字は「𠮷」(つちよし)くらいで、あとの文字は難読文字ばかり。目印の記号にしてInDesignに流し込んでも、元の文字をどうやって入力するかが問題になります。
それなら、サロゲートペア文字の箇所にその文字を示すコードポイントを直接記述しておいて、InDesignに流し込んだ後で元の文字に戻せればいいんじゃない?と思って、戻す方のスクリプトをひとつ前の記事で書きました。

今回はその前段階の、テキストエディタでサロゲートペア文字を「記号とUTF-16でのコードポイントの組み合わせ」に変換する方法を紹介します。

追記:
Macのテキストエディタ、CotEditor用AppleScriptも作ってもらいました!
記事の一番下に追加しました↓


私はWindowsユーザーで、テキストエディタはWindowsのMeryを使っているため、Mery専用JavaScriptマクロです。

キャプチャ151
//Meryさんでサロゲートペア文字をコードポイント表記に変換
var myTxt = Editor.ActiveDocument.Selection.Text;

var spChar = myTxt.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
if(spChar) {
var alertChar = spChar.length + "個置換しました\n\n";
for( i=0 ; i<spChar.length ; i++ ) {
//charCodeAtでコードポイントを取得して16進数で表示
sp1 = spChar[i].charCodeAt(0).toString(16);
sp2 = spChar[i].charCodeAt(1).toString(16);
spCode = "★"+sp1+","+sp2+"☆";
alertChar += spChar[i] + " → " + spCode + "\n";
myTxt = myTxt.replace(new RegExp(spChar[i],"g"), spCode);
}
Editor.ActiveDocument.Selection.Text = myTxt;
alert(alertChar);
}
else {
alert( "選択範囲にサロゲートペア文字はありません" );
}

リライト担当:流星さん。いつもお世話になっております<(_ _)>

キャプチャ152


Mac用テキストエディタCotEditor用AppleScriptはこちらです。MD5500さんが書いてくれました!

スクリーンショット 2015-10-27 23002

「変換結果が違う…」と思うでしょうけれどこれでOKです。サロゲートペア文字には二通りの表現があり、エンコード/デコードで双方に変換することができます。JavascriptとApplescriptのそれぞれ取り扱いやすい値を取得したということです。

 (*
サロゲートペア文字その3 テキストエディタでサロゲートペア文字をコードポイント表記に変換
http://subinosho.blog.fc2.com/blog-entry-35.html

AppleScript版

2015-10-26
*)



property qw : "\""

tell application "CotEditor"
tell document 1

set surrogatePair to "[\\u{010000}-\\u{10FFFF}]"
set myTxt to contents

set spChar to my rScan(myTxt, surrogatePair)
set spCharList to paragraphs of spChar

set alertChar to count of spCharList

if alertChar is not 0 then
set spCode to my chSP(myTxt, spCharList, alertChar)

set contents to my spCode
else
display dialog "サロゲートペア文字はありません" buttons {"OK"} default button 1
end if

end tell
end tell


on chSP(myTxt, spCharList, alertChar)
set spCode to {}


set i to 1
repeat with i from 1 to alertChar

set sp1 to my doshell("print (" & qw & item i of spCharList & qw & ".unpack(" & qw & "U*" & qw & "))")
set sp1 to my doshell("print (" & sp1 & "[0].to_s(16))")

set end of spCode to ("★" & sp1 & "☆")

set myTxt to my doshell("print " & qw & myTxt & qw & ".gsub(/" & item i of spCharList & "/){" & qw & item i of spCode & qw & "}")
end repeat

return myTxt

end chSP



on rScan(stg, serch)
set cmd to "puts " & qw & stg & qw & ".scan(/" & serch & "/)"
return (my doshell(cmd))
end rScan



on doshell(cmd)
set rb to "ruby -Ku -e "
--display dialog rb & quoted form of cmd
do shell script rb & quoted form of cmd
end doshell

※スクリプトは自己責任でご利用ください。正しく置換されているか必ず目で見てチェックすること。
関連記事
スポンサーサイト
コメント
コメント
コメントの投稿
URL:
本文:
パスワード:
非公開コメント: 管理者にだけ表示を許可する
 
トラックバック
トラックバック URL
トラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。