//次のマルチバイト文字へのポインタを取得 const char* next_c_mb(const char* c) { int L = mblen(c, 10); return c + L; }
//マルチバイト文字を一文字取り出す void ngetc(char* const dst,const char* src) { int L = mblen(src, 10); memcpy(dst, src, L); dst[L] = '\0'; }
//マルチバイト文字を比較する bool nchr_cmp(const char* c1, const char* c2) { int K = mblen(c1, 10); int L = mblen(c2, 10); if (K != L) return false; bool issame = (strncmp(c1, c2, K) == 0); return issame; }
std::vector<std::string> split_mb(const char* src, const char* del) { char tmp[10]; std::vector<std::string> result; std::string tmps; while (*src) { //デリミタを飛ばす const char* p = src; while (nchr_cmp(src, del) == true && *src != '\0') src= next_c_mb(src); //デリミタに遭遇するまで文字を追加し続ける while (nchr_cmp(src, del) != true && *src != '\0') { ngetc(tmp, src);//一文字取り出す tmps += tmp; src = next_c_mb(src); } if (tmps.size()) { result.push_back(tmps); } tmps.clear(); } return result; }
setlocale(LC_ALL, ""); std::vector<std::string> ret = split_mb("C:\\日本語表示フォルダ\\test\\contains", "\\"); for (size_t i = 0; i < ret.size(); i++) { printf("[%s]", ret[i].c_str()); }
[C:][日本語表示フォルダ][test][contains]
mblenはlocaleの影響を受けるのでsetlocaleする。
しない場合、’表’が1byteとしてカウントされてしまう。