掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
文字列の分割(UTF8) (ID:64508)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
とりあえず、UTF8をCStringに入れるべきではないし、 printfでうまいこと表示されるものではありません。 (printfで表示できるのはShift_JISです。) いろいろと問題があるので、サンプルを載せます。 UTF8のchar型配列の調達は、utf8.txtというUTF8コードでかいたテキストファイルから、 確認は utf8_ret.txtというUTF8コードのテキストファイルに出力してします。 #include <afx.h> #include <afxtempl.h> char* ReadUTF8Data(LPCTSTR filepath) { char* utf8data = NULL; TRY { CFile f(filepath, CFile::modeRead); const DWORD length = f.GetLength(); utf8data = new char[length + 1]; f.Read(utf8data, length); utf8data[length] = 0x00; f.Close(); } CATCH (CFileException, e) { if (utf8data) delete[] utf8data; return NULL; } END_CATCH return utf8data; } wchar_t* UTF8ToUTF16(const char* data) { wchar_t* utf16 = NULL; if (!data || !data[0]) return utf16; const int wlen = ::MultiByteToWideChar(CP_UTF8, 0, data, -1, NULL, 0); if (!wlen) return utf16; utf16 = new wchar_t[wlen + 1]; if (::MultiByteToWideChar(CP_UTF8, 0, data, -1, utf16, wlen)) utf16[wlen] = L'\0'; return utf16; } char* UTF16ToUTF8(const wchar_t* data) { char* utf8 = NULL; if (!data || !data[0]) return utf8; const int len = ::WideCharToMultiByte(CP_UTF8, 0, data, -1, NULL, 0, NULL, NULL); if (!len) return utf8; utf8 = new char[len + 1]; if (::WideCharToMultiByte(CP_UTF8, 0, data, -1, utf8, len, NULL, NULL)) utf8[len] = '\0'; return utf8; } BOOL WriteUTF8Data(LPCTSTR filepath, CTypedPtrArray<CPtrArray, char*>& utf8list) { TRY { CFile f(filepath, CFile::modeWrite | CFile::modeCreate); for (int i = 0; i < utf8list.GetSize(); ++i) { char* elem = utf8list.GetAt(i); f.Write(elem, strlen(elem) + 1); } f.Close(); } CATCH (CFileException, e) { return FALSE; } END_CATCH return TRUE; } int main() { // ファイルから読み込む(BOMなしUTF8コードのテキストファイル) char* utf8data = ReadUTF8Data(_T("utf8.txt")); if (utf8data) { // UTF16のコードの変換 wchar_t* utf16 = UTF8ToUTF16(utf8data); if (utf16) { CTypedPtrArray<CPtrArray, char*> utf8list; wchar_t buff[7]; for (const wchar_t* p = utf16, * last = p + wcslen(utf16); p < last; p += 6) { wcsncpy(buff, p, 6); buff[6] = L'\0'; // UTF16からUTF8に変換 char* utf8elem = UTF16ToUTF8(buff); if (utf8elem) utf8list.Add(utf8elem); // リストに追加 else break; } // 確認のためファイルに書き出す(0x00区切りのテキスト?ファイル) WriteUTF8Data(_T("utf8_ret.txt"), utf8list); // リストの削除 for (int i = 0; i < utf8list.GetSize(); ++i) delete utf8list.GetAt(i); utf8list.RemoveAll(); // UTF16文字列の削除 delete[] utf16; } // UTF8文字列の削除 delete[] utf8data; } return 0; }
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.