こんにちは。
くろんです!!
にてはまったポイントがあったので記録がてら記事にしておきます。
結論から言うと、完璧に解決はできずに応急処置的な感じで終わっていますので参考程度でどうぞ。
はまったポイントを簡潔に言うと
UTF-16LE(itunesお気に入りエクスポート文字コード)が正しく読み込めない
こんな感じです。
とりあえずやってみたことと失敗した内容は↓↓↓
ファイルからの読み込み
- stlを使う方法(ifstream/wifstream) → データをそのまま読み込めているようだが、1文字がchar型2バイトで読み込まれ、適切に1文字単位で読み込めない
文字コードの変換
- WideCharToMultiByte/MultiByteToWideChar → 文字コードをUTF-16LEにしても変換がうまくいかない(printf()で表示させるとバグる) - std::wstring_convertを使う → C++17で非推奨 & 変換しても表示がバグる
ここら辺はダメだった印象ですね…
ちなみにやってみてうまくいったのは、_wfopen_s()
でした。
コードはこんな感じです。
setlocale(LC_CTYPE, ""); wchar_t wstr[512]; FILE* pfile = nullptr; _wfopen_s(&pfile, L"./PATH", L"rt,ccs=UTF-16LE"); if(pfile == NULL) { return false; } if(fgetws(wstr, 512, pfile) == NULL) { return; } fclose(pfile);
このコードだと一応、UTF-16LEのファイルを読み込めました!
setlocale()が効いているのかよくわかりませんが、setlocale()を外すとうまく読み込めないので大事なことなのかと。
詳しくはわからないので勉強しないとですね…
itunesからエクスポートしたお気に入り情報の読み込みで詰まったら、是非使ってみてください。
では!