[C++] 153 マルチバイト文字有無の判定 コード改良の試み

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, FLTK 1.3.8, NO IDE]

前回の続きです。

そう言えば、ちょうど1ヶ月前にマルチバイト文字の抽出方法について記事を書いていました。その内容を流用します。

stringをwstringに変換して文字数を取得すれば、マルチバイト文字を1文字扱いにした全文字数+αが分かります。

これで文字列が可変長でも対応できるはずですが、自製カラーアプリのappファイルが落ちるようになってしまったため、前回のコードのままにしておきます。なおコンソール付きの実行ファイルでは問題なく動作します。

マルチバイト文字にあまり関わると深みにはまってしまうので、これ以上追究するのはやめておきます。

wstring narrowToWide(const string src) {
    wchar_t *wcs = new wchar_t[src.length() + 1];
    mbstowcs(wcs, src.c_str(), src.length() + 1);
    return wcs;
}

int multibyteDetect(string str){
    int length = str.length();
    cout << "length " << length << endl;

    wstring str_w = narrowToWide(str);
    int length_w = str_w.length();
    cout << "length_w " << length_w << endl;

    // stringの内容確認
    int i = 0;
    for (int b: str){
        cout << "string " << i << " " << b << endl;
        i++;
    }

    // stringの内容確認2
    for (int i = 0 ; i < str.length() ; ++i){
        cout << "string2 " << i << " " << str[i] << endl;
    }

    // wstringの内容確認
    int i2 = 0;
    for (int b: str_w){
        cout << "wstring " << i2 << " " << b << endl;
        i2++;
    }

    // wstringの内容確認2
    for (int i = 0 ; i < str_w.length() ; ++i){
        cout << "wstring2 " << i << " " << str_w[i] << endl;
    }

    if (length != length_w){
        return -1;
    }
    
    return 0;
}
--------------------------------------------------
出力例 #FFFFFF 数学記号の#(ここでの表記は1バイト文字の#)
--------------------------------------------------
length 10
length_w 8

string 0 35
string 1 -30
string 2 -128
string 3 -83
string 4 70
string 5 70
string 6 70
string 7 70
string 8 70
string 9 70

string2 0 #
string2 1 ?
string2 2 ?
string2 3 ?
string2 4 F
string2 5 F
string2 6 F
string2 7 F
string2 8 F
string2 9 F

wstring 0 35
wstring 1 8237
wstring 2 70
wstring 3 70
wstring 4 70
wstring 5 70
wstring 6 70
wstring 7 70

wstring2 0 35
wstring2 1 8237
wstring2 2 70
wstring2 3 70
wstring2 4 70
wstring2 5 70
wstring2 6 70
wstring2 7 70