こんな長いタイトルは初めてかな。
まあ、タイトルの通りです。
俺の持ってるファイルでいくつか転送できないものがあります。
原因はドイツ語でした。
aの上に点々がついてたりするのがあるじゃないですか。
あれがファイル名に入ってると転送できないんですね。
で、ちょっとプログラマっぽいことをしてました。
今日は1限からで昨日はあまり寝てないのに。
解決策はunicodeを使うこと。
ただこれだけです、はい。
導入方法はよくあるファイル検索のコードを使います。
WIN32_FIND_DATA fd;
を
WIN32_FIND_DATAW fd;
にするだけ。
これでunicodeでファイル名を取得できます。
(なんかdefineしただけで明示的にunicodeを使うことが出来るのがあった気がするけど忘れた)
もちろん、これを使う場合(たとえばファイルを開く)場合はワイド文字列用関数を使います。
fopen()なら_wfopen()みたいにです。
これでマルチバイト文字列の場合とワイド文字列の場合とでファイルを開いてみました。
そしたらワイド文字列で読み込めガチャンとドイツ語が入ってても読み込めました。
(_wfopen()の戻り値がNULLではなかったため読み込めたと思う)
しかし、コンソールではワイド文字列が表示できなかったので、
ワイド文字列をマルチバイト文字列にするのをがんばってました。
逆は前やったんですけどね。
まず、さくっと調べるとWideCharToMultiByte()が見つかりました。
それでその通りにやるとなぜかファイル名が切れる・・・。
中身を見てみるとワイド文字って2バイト文字でも1文字とカウントするんですね・・・。
つまり「あ」はマルチバイト文字では2文字ですが、ワイド文字では1文字。
これでは2バイト文字と1バイト文字が混同してる場合、
マルチバイト文字列をどれだけメモリ確保すれば良いの分かりません。
それであっちこっち調べてみるとwctomb()なる関数が。
ワイド文字をマルチバイト文字にする関数だそうです。
で、変換できないときは-1を、出来るときは1を返します。
これを利用して下のようにしてみました。
int len = 0;
for (int i = 0; i < wcslen(fileName); i++) {
char ch;
int def = wctomb(&ch, fileName[i]);
if (def == -1) len += 2;
else if (def == 1) len++;
}
これでようやく文字列長が分かるようになったわけです。
あとは求めた文字列長だけメモリ確保して・・・、
とやりたかったのですが、なぜか4文字分多く確保される・・・。
なぜだ・・・。
まあ、-4すればいいだけなんですけどね。
なんかキモイ。
と、まあ、こんな何も役に立たないプログラムを作ってました。
なんかほかにもまともなやり方があるんでしょうけど、俺にはこれが限界でした。
ああ、眠い。
amemboの制作者さんには後日連絡しよう。
もう風呂に入って寝ます・・・。
[0回]
PR