成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關于C++遍歷中文字符串的問題

開發
今天來介紹一個C++中的基礎問題:中文字符串的遍歷問題。首先我們來一個demo,假如要使用std::string遍歷"你好,世界123"這個字符串,你會怎么寫?

今天來介紹一個C++中的基礎問題:中文字符串的遍歷問題。可就是這么的一個基礎問題,也坑了我不少時間,真是應了那句話基礎不牢,地動山搖。

小試牛刀

首先我們來一個demo,假如要使用std::string遍歷"你好,世界123"這個字符串,你會怎么寫?

當時筆者是這么想的:

于是大手一揮,Ctrl C + Ctrl V寫下了一下代碼:

using namespace std;
int main() {
    std::string text = "你好,世界123";
    for (const auto c:text) {
        std::cout << "c:" << c << std::endl;
    }
    return 0;
}

運行起來一看,我都懵逼了,居然是亂碼...

一看到亂碼,筆者首先想到的可能編碼不是utf-8的,于是我改了一行代碼:

 std::string text = u8"你好,世界123";

結果還是于事無補,還是亂碼的,我開始有點慌了...

在這里說明一下當在C++中使用字符串字面值時,可以使用前綴u8來表示使用UTF-8編碼。這意味著該字符串會以UTF-8編碼的格式存儲在內存中。

面對這些亂碼,我不得不拿出CV工程師的殺手锏,趕緊上stackoverflow求助...

不負眾望,果然被我找到了答案。。。

馬上復制粘貼來驗證一波...

using namespace std;
int main() {
    std::string text = u8"你好,世界123";
    for(size_t i = 0; i < text.length();)
    {
        int cplen = 1;
        if((text[i] & 0xf8) == 0xf0) cplen = 4;
        else if((text[i] & 0xf0) == 0xe0) cplen = 3;
        else if((text[i] & 0xe0) == 0xc0) cplen = 2;
        if((i + cplen) > text.length()) cplen = 1;
        cout << text.substr(i, cplen) << endl;
        i += cplen;
    }
    return 0;
}

運行起來,果然是想要的結果。666,憑實力攻克了一個技術難題,帶領公司往前跨了一大步,這回升級加薪穩了吧!!!

尋根問底

本著舉一反三的學習態度,我想知道為什么中文字符串的遍歷要特殊處理,我找到了這個:https://en.wikipedia.org/wiki/UTF-8#Description

原來一個中文字符不一定是和英文一樣占用一個字符,它們可能會占用幾個字符,但它們的長度其實可以從字符的頭中讀取出來的。

我簡單地用瀏覽器翻譯了一下,大家將就這看一下大概意思

當然如果你不想自己寫獲取中文字符長度的邏輯代碼,也可以用別人寫好的開源庫。這里給大家推薦一個輕量級的,只有一個utf8.h文件的開源庫:https://github.com/sheredom/utf8.h

那么我們的代碼就變成了這樣:

int main() {
    std::string text = u8"你好,世界123";
    for (size_t i = 0; i < text.size();)
    {
        auto cplen = utf8codepointcalcsize(&text[i]);
        std::cout << text.substr(i, cplen) << std::endl;
        i += cplen;
    }
    return 0;
}

其實我們查看下utf8.h這個庫的utf8codepointcalcsize函數內部實現,和我們上面說的是一樣的。

這么一個簡單的坑,以前怎么沒發現這個問題?一個是沒遇到過這樣的需求,二是就算用到了也不是用C++實現的,例如在QT上直接使用QString就沒有這些問題。

責任編輯:趙寧寧 來源: 思想覺悟
相關推薦

2011-06-16 17:01:21

Qt MeeGo 排序

2010-02-02 16:49:32

C++中文字符

2009-11-26 16:26:32

PHP字符串mbstr

2009-11-26 16:43:11

PHP截取中文字符串

2021-09-07 09:23:07

C++字符串算法

2009-12-01 15:41:16

PHP substr截

2010-03-05 16:09:44

Python中文字符

2010-02-02 11:27:16

C++字符串

2010-02-05 09:57:25

C++中英文字符串

2011-07-18 13:34:44

SQL Server數拼接字符串

2023-12-11 15:18:03

C++字符串Unicode

2021-07-30 06:22:37

C++字符型字符串

2010-02-04 17:39:48

C++字符串類型

2010-02-04 17:32:43

C++中C風格字符串

2009-11-27 09:55:11

PHP截取中文字符

2021-08-20 06:58:31

C++Python函數

2024-02-22 09:46:04

C++字符串格式化開發

2009-11-27 09:30:58

PHP函數mb_str

2010-02-01 16:46:07

C++格式化字符串

2010-02-02 18:01:47

C++字符串替換函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 三级黄色片在线播放 | 久久久国产精品视频 | 国内自拍第一页 | 精产国产伦理一二三区 | 欧洲成人 | 国产精品美女久久久久aⅴ国产馆 | 国产a区 | 天堂一区二区三区四区 | 视频一区在线 | 国产精品久久久久久久白浊 | 91久久久久久久久久久久久 | 麻豆久久久9性大片 | 久久久久久亚洲精品 | 日韩中文字幕在线观看 | 在线观看中文字幕亚洲 | 天天操天天射综合网 | 欧美日韩亚洲系列 | 999观看免费高清www | 91精品国产欧美一区二区 | 伊人看片| 亚洲精品久久久久久久久久久久久 | 成人在线视频观看 | 香蕉久久网 | 国产欧美精品 | 99亚洲综合 | 欧美日韩视频 | 91免费在线 | 亚洲免费观看视频 | 国产免费人成xvideos视频 | 99精品欧美一区二区蜜桃免费 | 国产一区二区三区精品久久久 | 成人欧美一区二区三区在线观看 | 91精品久久 | 在线黄色影院 | 国产一二区免费视频 | 97人人澡人人爽91综合色 | 国产精品久久久久久亚洲调教 | 成人小视频在线观看 | 国产精品久久久久久久久久免费 | 久久精品小视频 | 久久国产精品免费一区二区三区 |