スポンサーサイト

Tags :
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

XML等の文字参照を通常の文字列に戻すAppleScript

■4/7追記 こちらのエントリにもっとシンプルなのがあります。
Webで利用される様々な文字列エンコードを扱うためのAppleScriptいろいろ


『&』や『〹』といった文字参照を含む文字列を通常の文字列に戻すAppleScript。

Twitterなんかの海外のWebサービスのRSSや、APIで取得出来るXMLの日本語部分が数値文字参照で返ってくるものがありますが、それを AppleScriptで扱うにはどうしたら良いか…やり方を軽く探してみたんですが見付けられなかったので自分で書きました。OSAXとかありそうですけど、とりあえず素の状態でやりたかったんで。

何が何でもAppleScriptで処理しないといけない場面はそれほど無いとは思いますが。

スクリプトの要になる、文字を変換する部分は最近かじり始めたpythonを使ってます。あと、これは以前ぴよまるさんが文字列を処理するのにpythonを使ってられたのをヒントにしました。

このスクリプトを実行すると、復元された文字列が表示されます。

1文字ずつdo shell scriptで変換して行くので処理はやや遅いです。数文字まとめてpythonに渡すようにした方が良かったですね。整形が面倒ですけど。

『&』等を1つだけ引数で渡して変換した文字を返す部分だけ関数化しました。

■2/15追記■
気になった部分を若干修正

■3/3追記■
MacOSX10.5のAppleScript2.0だと、Unicode textのidプロパティ使えばもっと素直に変換できますね

■動作確認■
MacOSX10.4.11
property bslashChr : ASCII character (128)

--my_stringsに処理する文字参照を含んだ文字列を入れておく
set my_strings to "&等の実体参照や〹といった数値文字参照を通常の文字に変換します。" as Unicode text

--my_stringsの文字列を{"a","b","c","&","〹"}のようなリストに分解
set chr_list to {}
set chrRef to "" as Unicode text
set flg to false
repeat with cnt from 1 to (count of my_strings)
    set chr to item cnt of my_strings
    if chr is "&" and (item (cnt + 1) of my_strings is not "&") and flg is false then
        set flg to true
        set chrRef to chr
    else
        if flg is true then
            if chr is ";" then
                set end of chr_list to chrRef & ";"
                set flg to false
                set chrRef to ""
            else
                set chrRef to chrRef & chr
            end if
        else
            set end of chr_list to chr
        end if
    end if
end repeat

--リストの要素を1つずつ変換してmy_textに追加していく。変換出来ないものはそのまま文字として追加
set my_text to "" as Unicode text
repeat with chr in chr_list
    set returned_chr to my decodeCharacterReferences(chr)
    if not returned_chr is false then set chr to returned_chr
    set my_text to my_text & chr
end repeat

display dialog my_text


(*
    実体参照および数値文字参照を『1文字ずつ』変換
    &#および;を付けたまま引数として渡す
    文字コードは16bit以下 10進表記限定(Ӓの表記)
    XMLの仕様で定義されている 「&」 , 「<」 , 「>」 , 「"」 , 「'」 を変換出来る事は確認
*)
on decodeCharacterReferences(chrRef)
    if chrRef starts with "&#" and item -1 of chrRef is ";" then
        set chrRef to (items 3 thru ((count of chrRef) - 1) of chrRef)
        try
            set scpt to "python -c 'print unichr(eval(\"" & chrRef & "\")).encode(\"utf-8\")' "
            return do shell script scpt
        on error
            return false
        end try
    else if chrRef starts with "&" and item -1 of chrRef is ";" then
        if chrRef is "'" then return "'" --'はhtmlentitydefsモジュールのname2codepointに定義されてない?
        set chrRef to (items 2 thru ((count of chrRef) - 1) of chrRef)
        try
            set scpt to "python -c 'import htmlentitydefs; print unicode(\"" & bslashChr & bslashChr & "u%04x\" % htmlentitydefs.name2codepoint[\"" & chrRef & "\"],\"Unicode-Escape\").encode(\"utf-8\")'"
            return do shell script scpt
        on error
            return false
        end try
    end if
    return false
end decodeCharacterReferences
関連記事
スポンサーサイト

コメント

非公開コメント

Profile
choco
Author : choco

印刷・製版の現場を経て、広告制作会社でPhotoshopを使ったビジュアル制作を担当。

→現在は車載機器開発ベンダにて、組み込み3Dデータ作成やUIデザインなどを行っています。

Categories
Favorites


Search
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。