読者です 読者をやめる 読者になる 読者になる

cocos2d-x std::stringにUTF8の文字を入れて 1文字ずつ処理

std::stringにUTF8の文字を入れて 1文字ずつ処理する

WindowsAndroid共通で動作する物

#define UTF8_CHAR_LEN( byte ) ( ( 0xE5000000 >> ( ( byte >> 3 ) & 0x1e ) ) & 3 ) + 1

 int GetUnicodeLength(const char* utf8)
{
    int ByteCount = 0;
    while (*utf8){
        int charlen = UTF8_CHAR_LEN(*utf8);
        ByteCount++;
        utf8 += charlen;
    }
    return ByteCount;
}
void GetUnicodeChar(const char* utf8, int charnum, int& index, int& len)
{
    int ByteIndex = 0;
    int ByteLength = 0;
    for (int i = 0; i <= charnum; i++){
        if (i == 0) {
            ByteLength = UTF8_CHAR_LEN(*utf8);
        }
        else {
            int charlen = UTF8_CHAR_LEN(*utf8);
            ByteIndex += charlen;
            utf8 += charlen;
            ByteLength = UTF8_CHAR_LEN(*utf8);
        }
    }
    index = ByteIndex;
    len = ByteLength;
}

 

std::string moji_text = UTF8Bom無で保存した外部ファイルから読込

//文字数を取得する

int len = GetUnicodeLength(moji_text.c_str() );

int i = 0, charindex = 0, charlength = 0;

for (; i < len; i++) {

//文字のインデックスと長さを取得

        GetUnicodeChar(moji_text.c_str(),i, charindex, charlength);

//moji に1文字読込
        std::string moji = moji_text.substr(charindex, charlength);

//処理を記載

}