スポンサーリンク

| キーワード:

C++でsplit (2) – マルチバイト版,’\’対応

1.補助関数作成

次のマルチバイト文字へのポインタを取得する関数

//次のマルチバイト文字へのポインタを取得
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;
}

2.split関数本体

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としてカウントされてしまう。

C++でsplit (1) – strtok版

C++でsplit (2) – マルチバイト版,’\’対応

C++でsplit (3) – utf16版

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: