日記緑ログ

2005/10/05 ~ 2005/10/30

目次

戻る

Blog

文字コード変換についての馬鹿言

[Create: 2005/10/05 21:59] [LastUpdate: 2005/10/08 22:23]

JIS-SJISとかJIS-EUCとかSJIS-EUCとかこう、変換したいと思うことはよくあります。それぞれ結構簡単に変換できるのですが、厳密にやろうとすると悩ましい問題が出てきます。

(EUCはEUC-JPのことです。念のため。)

そ れぞれバージョンというか年代によって違ったり、ベンダ拡張があったりしてややこしい部分はありますがそれを差し置いてもJISで1バイトカタカナとか EUCでもカタカナとかJIS補助漢字(大体3バイト)とかはよくある間に合わせというか簡潔に表されているコード(プログラムのソースコードのことです よ念のため)ではまともに扱えないわけです。

ICUでも使ってUNICODE処理でもすればそこそこ安心ですが、ICUは結構ヘビーで、たとえばオンラインソフトで気軽に使ってみるとどうも配布が億劫になりそうです。

iconv使えとかnkfだろだとかUnKanj使えとかいうあたりがいい線でしょうか。

生きている証とか in 2005-10

[Create: 2005/10/14 19:51] [LastUpdate: 2005/10/14 20:12]

生きてる証拠にねたもないのに書いてみます。

WindowsのPlatformSDKを新しくしてやるとstrsafe.hあたりの面白い機能が使えるようになって楽しそうです。まあstringクラス使えばあまり必要ないのですが…。

string 関係で悩ましい問題がPATHです。バックスラッシュ問題がどうのという話はありますが、PATHにUNICODE文字列が使える処理系だとマルチバイト 文字列で単純に処理しようとすると困ったことになります(例:ハングルとひらがなが交じり合ったファイル名あるいはディレクトリ)。

かといって(あくまでWindowsの話ですすめますが)UNICODEビルドしたアプリケーションは9x系のWindowsでは動作しません。捨てることをお勧めしてもいいのですが実は家でも95と98のマシンが現役です。

そこで動的に切り替えるというあほなことをしたくなってくるのですが、実行ファイルを二つ用意してあげれば問題はないんでしょうね…。

UNICODEパスを確実に扱う

[Create: 2005/10/21 07:39] [LastUpdate: 2005/10/21 08:00]

Unicodeパスの例

そのうち記事をばっさり整理します。

UNICODEパスの話です。

9x系でもNT系でも動くようにMBCSでビルドすることはよくあります。いいかげん二つビルドすればいい話ですがテストも面倒なのでさておき、NT系では例えばユーザーアカウントにもUNICODE文字列を使えます(図)。

この例では日本語とアラビア語とヘブライ語の文字を使っています。

アカウントルートのApplication Data下に設定を保存することをMSが推奨していますがすでにパスにUNICODE文字列が含まれているためANSIコードベースでパスを扱おうとすると失敗します。

また9xではアカウント別のApplication Dataフォルダが無い場合がありますので実行ファイルと同じフォルダにユーザーアカウントのフォルダを作ってその下に保存するということをしているものもあります。

そういうものの代表格としてxyzzyとJmEditを試してみた結果、失敗しました。

も ちろん普段こんな事をする人はあまりいないでしょうが可能性としてUNICODE文字のファイルを保存する、あるいは現在の設定の言語とは異なるコード ベースの文字を使ったファイルを保存してあるケースも考えられます(実際に以前、ハングルのコードベースで動くゲームかでハングルのファイルがたくさんで きたことがある。ちなみにアーカイバはUNICODE対応していないものが結構あって苦労したりした。)。

そこでこういう場合に問題を起 こらなくするためには何をすればいいのかといえばできれば内部での文字コードをUNICODEに統一して(CJK問題とかが無いわけではないがどうせ UNICODEベースなら同じだしANSIベースでもほかの二つは使わないことが分かっているから問題は出ないだろう)入出力のところは例えば LoadLibraryしてGetProcAddressしたCreateFileWとCreateFileAをOSによって切り替えて使うといった配慮 をする必要があるでしょう。

まあUNICODEベースのビルドを作ったほうが楽で早いと思いますが…

ペットボトル湯たんぽ

[Create: 2005/10/25 20:52] [LastUpdate: 2005/10/25 21:20]

よくある話ですがペットボトルに風呂の湯を入れて湯たんぽにします。

あまり熱い湯を入れられず、2L程度ですので冷めやすいのですが結構有効です。

(電気)あんかという手もありますがお手軽度と経費で言えばこちらが上では?

灯油の値段が昨年の倍程にまで値上がりしていますので家族で固まって暖を取ったり、こういう工夫で寒さをしのぐのが有効だと思います。

つ いでに言えば薪ストーブとか火鉢とか練炭の(あるいは豆炭でも)こたつとか使えば完璧でしょうがそれぞれ火を伴いますので危険です。しかも二酸化炭素、一 酸化炭素中毒が怖いので現代的な機密性の高い住宅ではできるだけ避けたいところです。でも練炭のこたつは1000W程度の電気こたつなど問題にならないく らい(それこそほかの暖房が要らないぐらい)暖かいのでお勧めしたいのですが…

客とトランプは「接待」

[Create: 2005/10/26 13:54] [LastUpdate: 2005/10/26 13:56]

客とトランプは「接待」 松山のメードカフェを指導

なにが言いたいかというとメードじゃなくてメイドじゃないのかと。

UNICODE文字

[Create: 2005/10/28 21:15] [LastUpdate: 2005/10/28 21:48]

UNICODE文字というのはおかしいんですが、JIS外文字というかそういう文字です。

MS-IME 2002では"ハート"や"温泉"でそれぞれとが出るらしいです(化けていたらごめんなさい)。これはMS-IME 2000でIMEパッドを開き文字一覧を表示、Unicodeに切り替えて入力しました。

ハートマークなどはHTML 4.01でも♥として規定されていますし(トランプの4つの図柄はそれぞれspades、clubs、hearts、diamsとして規定されている)、音楽等の歌詞やタイトルでもよく使う文字です。

そのためファイル名で使うことはままあると思いますが当然のようにWindows9x系では文字化けしますし、そもそもアーカイバ等でまとめようとしてもzip等では対応していません(マルチバイト文字と規定されている)。RARはUnicodeに対応しているはず。

Unicode で何が困るかというとこのあたりでバックアップを取るときに少々痛い目にあいそうだということです。CDでもJolietにすればUnicodeでファイ ル名を扱いますからいいのでしょうが、ファイルがばらばらだと効率も悪いのでアーカイブにすることはよくあるはずです。

フリーで安定していてメジャーなアーカイバといえば7-zipぐらいしか思い浮かびませんがこれから段々お世話になることになりそうです。

# ちなみに私はUnicode至上主義でもありませんし、嫌ってもいません。郷に入りては郷に従えぐらいの考えでこれだけ広まってきているし、おかげで海外 のソフトも文字化けしにくくなったし、OSレベルで扱えるものをアプリケーションレベルで使えなくしてしまうのはもったいないし、不便でかつ傲慢だと思う からじゃあ仕方ないから使おうか。できれば広めようかという程度の考えです。

OEMコードページとファイルシステム

[Create: 2005/10/30 19:24] [LastUpdate: 2005/10/30 19:51]

今時分OEMコードページを考慮したプログラムを組んでいる人がどれほどいるのか分かりませんが、実際にあるものはあるのです。

OEM文字列ってなんなの?というとDOSの時代の遺産というかDOS時代に使っていたコードです。WindowsではシェルはANSIコードページを使っているのです。

日本語の場合SHIFT-JIS(というと怒られるかもしれないがCP932の事です)で同じですが(というよりもアジア圏では同じなんですが)東西ヨーロッパ圏ではやたら違います。

これが今時意味があるのかどうかは実は疑問なんですが少なくともFATの8.3形式では(FAT32であっても)ファイルシステムは基本的にDOSのFAT16ですのでOEMコードページの文字列として保存してあるわけです。

LongFileName ではUNICODEだったりするのでWindows95以降の32bit WindowsではSetFileApisToANSIでも呼んでおけば気にする必要が無い気もします(コンソールモードの時はOEMがデフォルトで Windowアプリケーションの場合はANSIがデフォルトになっているというようなことがMSDNに書いてあるので実際は呼ぶ必要も無いのでしょう)。 恐らくはKernelで変換作業をしてくれるのでしょうから。

しかし丁寧にやるとしたらAreFileApisANSIで調べて、場合によって OemToChar(OemToAnsi)とかCharToOem(AnsiToOem)や、MultiByteToWideChar、 WideCharToMultiByteをCP_ACP、CP_OEMCPあたりを切り替えて呼ぶ必要があるかもしれません。