メモ@inudaisho

君見ずや出版 / 興味次第の調べ物置き場

はてなブログ移行時の文字化け対策

 はてなブログ移行時の文字化けについて解決した。これは自分がはてなダイアリーをいうならばハックして無理に本来はてなダイアリーでは使えない漢字を入力していたから起こった問題ではあるのだが、ネチネチとはてなの運営の方に対応を要求してかなわなかったものだ。

 しかしやってみたら割と簡単にできた。変な漢字はなにかのタイミングでHTML数値文字参照に変換されてたようで、もっとあったような気がしたがあまり拾えなかった。やりかたは はてなダイアリーMovableType形式で出力したものと、インポート後のはてなブログMovableType形式で出力したものから英数字記号を消して diff をとり、両方で違うものをピックアップしていくというもので、それならすぐにできた。

 こんな感じのものを書いた。

import difflib
import re
oReEn = re.compile("[\0-~]")

def parseMT(sM):
    dEnt = {}
    for eM in sM.split("--------\n"):
        aEnt = eM.split("-----\n")
        dHead =dict(_.split(":",1)for _ in aEnt[0].split("\n") if ":" in _ )
        if "DATE" in dHead:
            aDate = dHead["DATE"].strip().split(" ")[0].split("/")
            sDate = "-".join((aDate[2],aDate[0],aDate[1]))
            sTxt = aEnt[1]
            sTxt = re.sub(oReEn,"",sTxt)
            if sDate in dEnt:
                dEnt[sDate] += sTxt
            else:
                dEnt[sDate] = sTxt
    return dEnt

#はてなダイアリーからエクスポートしたもの
dOld = parseMT(open("inudaisho.txt","r").read())
#はてなブログからエクスポートしたもの
dNew = parseMT(open("inudaisho.hatenablog.com.export.txt","r").read())

aRes = []
for sD in sorted(dOld.keys()):
    sOld = dOld[sD]
    sNew = dNew[sD]
    if sOld != sNew:
        aRes.append(sD)
        aRes.append("".join(difflib.ndiff(sOld,sNew)))
open("nDiff.txt","w").write("\n".join(aRes))

 そしてこの出力した差分ファイルをvimで開いて

/- .+ 

 でこれ。

f:id:inudaisho:20190120142118p:plain
vim で検索しただけ

 この方法で探せるものはあんまりなかったので直接ブログひらいて適当に修正した。ひょっとしたら(株)はてなの営業努力で数値文字参照に変換してたのかもしれないが、その変換が間違っていたらもう手も付けれない。それよりも今はまちがってmarkdown形式として登録してしまったところだが.... 今いちいち修正しているとどうもmarkdown形式ということで登録されても中身までは代わっていないようだ。そんなら改めて上書きできるかな? → できた。