Mac OS X+REALbasic+Perlを使ってUTF-8テキストに含まれる濁点を文字

Mac OS X+REALbasic+Perlを使ってUTF-8テキストに含まれる濁点を文字化けさせずにURLエンコードする
というタイトルなのに何故か欠けている。もういいや

とりあえずできた
ちゃんとしたPerlのソースと、汎用性のあるREALbasicのコードは後日掲載ということで。


Dim EncodeShell As New Shell
Dim temp As String
Dim c as TextConverter
temp="あああああ"
c = New TextConverter
c=GetTextConverter(encodings.UTF8, encodings.utf8)
EncodeShell.Execute ("echo "+temp+" | iconv -f UTF-8-MAC -t UTF-8")
EncodeShell.Execute ("perl -e 'use UTF8; $CHANGEWORLD = "+quote+EncodeShell.Result+quote+"; $CHANGEWORLD =~ s/([^\w ])/"+quote+"%"+quote+".unpack("+quote+"H2"+quote+", $1)/eg; $CHANGEWORLD =~ tr/ /+/; print($CHANGEWORLD);'")
temp=EncodeShell.Result
EncodeShell.Close
msgbox(c.convert(temp))


何がなんだかよくわからないが、UTF-8-MACというエンコーディングがあるらしい(?)。ここが問題を解くカギになるようだ。


正式になんて言うのかよくわからないが、濁点も1文字で数える特別仕様のUnicode(UTF-8)らしくて
これを普通のUTF-8として扱おうとすると濁点が=とかいう文字に化ける。


REALbasicのEditFieldとかで扱える文字がUTF-8-MACなのか、Mac OS Xで扱っているUTF-8が全部UTF-8-MACなのか
ShellのPerlに渡す過程でUTF-8-MACに変化しているのかもサッパリわからないが、とにかく今回のようなパターンでは問題が発生する。


で、その解決方法。
このUnicodeもどき(UTF-8-MAC)を普通のUTF-8に変換するのにiconvというコマンドを使わないといけないようだ。
ウェブで見つけたコマンドの実行例とかを応用しつつ実装してみた。
ShellのResultにUTF-8となった文字列が帰ってくるので、これを続けてperlでURLエンコードしてやる。


Google先生でURLエンコード実装例を探していたところ、先頭にuse UTF8;をつけるといいとかなんとかいう話を聞いたので、おまじない程度につけておいた。



1.シェルを立ち上げる(この時点でMac OS X限定技)
2.echoコマンドでUTF-8の元テキストを出力、iconvとかいうコマンドでUTF-8-MACというエンコーディングからUTF-8に変更
3.変更されたものがShellのResultに帰ってくるので、これをまたシェルのPerlにわたしてやる
4.UTF-8をURLエンコードした文字列が得られる


本当はREALbasic単体で全部できたほうがベターなのだが、URLエンコードの仕組みがさっぱりわからないし
分かろうともしていないのでこれでいいことにする。


つまりこう思っている限りは、Mac OS 9版のねとらじ交換機ではDJ名の送信がサポートされないということだ。まあいっか。



REALbasicで「URLデコード」をする場合のPerlとの連携技についてはこちらを参照。

2008-07-25 REALbasicでURLデコードを試みたが失敗したのでPerlに頼ることに
http://d.hatena.ne.jp/isogame/20080725
2008-07-28 REALbasicでURLデコードできなかったのでPerlに頼る(2)
http://d.hatena.ne.jp/isogame/20080728