Tips

IT技術系Tips

Sublime Text3でコードポイントを表示するプラグイン作ってみた(sjis対応版)

前回作ったプラグインを改善して、sjiseuc-jpも加えた。
os x 10.9.2、sublime text3のみ動作確認済み。
f:id:kaerouka:20140325040418p:plain
sjisってゆうのはphpでいうところのsjis-win、javaでいうところのms932のこと。
euc-jpは・・・・

今回も、ソース→導入方法→愚痴の流れでいこうかと。

ソース

import sublime, sublime_plugin
import codecs


class CodePoint3Command(sublime_plugin.TextCommand):
    def run(self, edit):
        pos = self.view.sel()[0].begin()
        c = self.view.substr(pos)

        d = [
        ("SJIS:\t\t\t", "".join([hex(x)[2:] for x in codecs.encode(c, "cp932")]).upper())
        ,("UTF-8:\t\t", "".join([hex(x)[2:] for x in c.encode('utf-8')]).upper())
        ,("EUC-JP:\t", "".join([hex(x)[2:] for x in codecs.encode(c, "euc_jp", "ignore")]).upper())
        ,("Unicode:\t", hex(ord(c)).upper()[2:].zfill(4))
        ]

        text = "Sample:\t" + c + "\n\n" \
        	+ "".join([x[0] + "0x" + x[1] + "\n" for x in d])

        sublime.message_dialog(text)

導入

前回とまったく同じなので、そちら参照。

Codecs33に依存しています。
sublime text 3でsjisを扱うためにConvertToUTF8を入れている人は多いと思いますが
ConvertToUTF8導入時にCodecs33は入れてるはずなので、このプラグインを使いたいという奇特な方は、既にCodecs33は入ってると思います。

愚痴

さぁてやってまいりました、メインコンテンツ。
euc_jpのエンコードのソース。

,("EUC-JP:\t", "".join([hex(x)[2:] for x in codecs.encode(c, "euc_jp", "ignore")]).upper())

第3引数に"ignore"って指定してるのね。
encodeの第3引数は、errorsを指定するところ。
もうね・・・変換できないとか言うわけですよ、Pythonさんが。
何が変換できないかって?

外字です。

外字ってゆうのは、wikipedia外字ページにあるように、Unicodeの、U+E000〜U+F8FF、U+000F0000〜U+000FFFFD、U+00100000〜U+0010FFFDの範囲に割り当てられる文字の事。

あー、意味わかんねーと思うかもしれないけど、金融機関なんかは自分のところで外字フォント作って、わけわからん漢字を割り当ててたりするのね。
例えば、U+E000だったら「髙」(はしご高)が表示されるようにしよー!みたいな感じで、独自のフォントを作ってる。
「髙」はjisには無くて、扱えない(もしくは昔は扱えなかった)ところもあるからこんな感じになってる。

で、codecs.encodeで使える文字コードの一覧を見ると、EUC関連は3つあるけど、全滅。

UnicodeEncodeError: 'euc_jisx0213' codec can't encode character '\ue000' in position 0: illegal multibyte sequence

私の心境
f:id:kaerouka:20140325045621j:plain
ザッケローニ監督
画像の出典:nikkansports.com

しょーがないからignore指定して、変換できなかったら諦めてこうした。
f:id:kaerouka:20140325050012p:plain

どーーーーしても変換したいなら変換テーブルとか自分で定義して

try:
    eucjp_c=codecs.encode(c, "euc_jp", "ignore")
except UnicodeEncodeError:
    eucjp_c=自分で変換処理

みたいに書くんだろうけど、さすがにだるいよね。
だって、私がEUCとか使ったの10年前くらいが最後だし・・・さよならEUC

ちなみに、秀丸文字コード表示機能をパクってこの機能を作ってみたわけだけど
秀丸だと、UnicodeのE000がEUCでFFA1になってる。
f:id:kaerouka:20140325050744p:plain
私が期待するのはeucJP-msのF5A1。
う~む、EUC恐るべし。

そういや触れてなかったけどサロゲートペア・・・
気づかなかったことにしよう。