iOS 中英文字符串的字?jǐn)?shù)

???????開(kāi)發(fā)類(lèi)似輸入框輸入或者顯示固定文本的 label 時(shí)候咨油,可能遇到需要限制顯示的字符串字?jǐn)?shù)

NSString *contentString = @"新年快樂(lè)";
NSUInteger contentLength = contentString.length;
NSLog(@"%lu", (unsigned long)contentLength);
//輸出: 4

NSString *contentString2 = @"HappyNewYear";
NSUInteger contentLength2 = contentString2.length;
NSLog(@"%lu", (unsigned long)contentLength2);
// 輸出:12

???????然后當(dāng)需要對(duì)限制輸入的字?jǐn)?shù),如前四個(gè)

NSString *contentString22 = [contentString2 substringToIndex:4];

???????會(huì)發(fā)現(xiàn) contentString2 輸出 “Happ”原在,到這里其實(shí)問(wèn)題不大友扰,可是產(chǎn)品會(huì)提出,英文應(yīng)該是兩個(gè)數(shù)一個(gè)庶柿,因此截出來(lái)的應(yīng)該得是“HappyNew”村怪。
問(wèn)題就在于使用 @property (readonly) NSUInteger length; 獲取到的是不論是中文字符還是英文字符,或者其他浮庐,都是一個(gè)個(gè)算甚负。而在 Unicode 編碼中:一個(gè)中文字符=2個(gè)Unicode,一個(gè)英文字符=1個(gè)Unicode。所以可以采用 Unicode 的個(gè)數(shù)來(lái)計(jì)算字符串長(zhǎng)度腊敲,如下兩種方法:

// 方法一、
NSUInteger contentLength = 0;
char* p = (char*)[contentString cStringUsingEncoding:NSUnicodeStringEncoding];
for (int i = 0; i < [contentString lengthOfBytesUsingEncoding:NSUnicodeStringEncoding]; i++) {
    if (*p) {
        p++;
        contentLength++;
    }
    else {
        p++;
    }
}
NSLog(@"%ld", contentLength);
// 方法二维苔、
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSData *data = [contentString dataUsingEncoding:enc];
NSUInteger contentLength2 = [data length];
NSLog(@"%ld", contentLength2);

???????通過(guò)上面計(jì)算出來(lái)會(huì)多兩倍的 length碰辅,然后通過(guò)向上取整

NSUInteger contentLength3 = ceilf(contentLength/2.0f);

???????到這里還有個(gè)問(wèn)題,當(dāng)字符串里面有“一”時(shí)介时,使用方法一計(jì)算出來(lái)的 Unicode 個(gè)數(shù)是1没宾,而“二、三沸柔、四”這些分別是2循衰,也就是類(lèi)似這種“一”需要特殊處理,如此褐澎。方法二測(cè)試正常会钝。

NSUInteger count = [contentString countWithString:@"一"];
contentLength += count;

注意:這里只針對(duì)中英文字符串,即不包括這種 Emoji 這種是4個(gè) Unicode工三,建議刪除迁酸,或者擴(kuò)展計(jì)算

???????最后對(duì)于中英文的截?cái)啵?Unicode 計(jì)算俭正,即兩個(gè)英文按一個(gè)字?jǐn)?shù)計(jì)算奸鬓,補(bǔ)足的向后不一個(gè)字?jǐn)?shù),也就是可能出現(xiàn)一個(gè)英文(或者說(shuō)奇數(shù)個(gè)英文)掸读,即不足一個(gè)字?jǐn)?shù)串远,下面的算法是不算在字?jǐn)?shù)里面。

NSString *contentString = @"新年aaa快樂(lè)aaa";
NSString *finalContentString = contentString;
NSUInteger unicodeCount = 0;
NSUInteger unicodeLength = [contentString lengthOfBytesUsingEncoding:NSUnicodeStringEncoding];
NSUInteger maxLenght = 4 * 2;
if (unicodeLength > maxLenght) {
    NSUInteger subLength = 0;
    char* p = (char*)[contentString cStringUsingEncoding:NSUnicodeStringEncoding];
    p++;
    for (int i = 0; i < unicodeLength; i+=2) {
        if (*p) {
            subLength+=2;
            p+=2;
        }
        else {
            subLength++;
            p+=2;
        }
        unicodeCount++;
        if (subLength >= maxLenght) {
            break;
        }
    }
    finalContentString = [contentString substringToIndex:unicodeCount];
}
NSLog(@"%@", finalContentString);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末儿惫,一起剝皮案震驚了整個(gè)濱河市澡罚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肾请,老刑警劉巖始苇,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異筐喳,居然都是意外死亡催式,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)避归,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)荣月,“玉大人,你說(shuō)我怎么就攤上這事梳毙〔刚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)萌业。 經(jīng)常有香客問(wèn)我坷襟,道長(zhǎng),這世上最難降的妖魔是什么生年? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任婴程,我火速辦了婚禮,結(jié)果婚禮上抱婉,老公的妹妹穿的比我還像新娘档叔。我一直安慰自己,他們只是感情好蒸绩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布衙四。 她就那樣靜靜地躺著,像睡著了一般患亿。 火紅的嫁衣襯著肌膚如雪传蹈。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,985評(píng)論 1 291
  • 那天步藕,我揣著相機(jī)與錄音卡睦,去河邊找鬼。 笑死漱抓,一個(gè)胖子當(dāng)著我的面吹牛表锻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乞娄,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瞬逊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了仪或?” 一聲冷哼從身側(cè)響起确镊,我...
    開(kāi)封第一講書(shū)人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎范删,沒(méi)想到半個(gè)月后蕾域,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡到旦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年旨巷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片添忘。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡采呐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搁骑,到底是詐尸還是另有隱情斧吐,我是刑警寧澤又固,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站煤率,受9級(jí)特大地震影響仰冠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蝶糯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一洋只、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧裳涛,春花似錦木张、人聲如沸众辨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鹃彻。三九已至郊闯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛛株,已是汗流浹背团赁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谨履,地道東北人欢摄。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像笋粟,于是被迫代替她去往敵國(guó)和親怀挠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容