Sublime Text3でコードポイントを表示するプラグイン作ってみた(sjis対応版)
前回作ったプラグインを改善して、sjisとeuc-jpも加えた。
※os x 10.9.2、sublime text3のみ動作確認済み。
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
私の心境
ザッケローニ監督
画像の出典:nikkansports.com
しょーがないからignore指定して、変換できなかったら諦めてこうした。
どーーーーしても変換したいなら変換テーブルとか自分で定義して
try: eucjp_c=codecs.encode(c, "euc_jp", "ignore") except UnicodeEncodeError: eucjp_c=自分で変換処理
みたいに書くんだろうけど、さすがにだるいよね。
だって、私がEUCとか使ったの10年前くらいが最後だし・・・さよならEUC。
ちなみに、秀丸の文字コード表示機能をパクってこの機能を作ってみたわけだけど
秀丸だと、UnicodeのE000がEUCでFFA1になってる。
私が期待するのはeucJP-msのF5A1。
う~む、EUC恐るべし。
そういや触れてなかったけどサロゲートペア・・・
気づかなかったことにしよう。