Edited at

Ojbective-Cで絵文字を見た目通りにカウントする

More than 3 years have passed since last update.


Repository

NSString-ActualLength

MIT LICENSE.


Issue

NSString lengthは絵文字を含むとカウントが予期せぬ値になる。


obj-c

NSLog(@"string: %@ length: %ld", str, [str length]);


output

xctest[-] string: 🔴🔴🔴🔴🔴 length: 10

xctest[-] string: 👦 length: 2
xctest[-] string: 👦👦🏿 length: 6
xctest[-] string: 👦🏼👦🏿 length: 8
xctest[-] string: 👨‍👩‍👧‍👦 length: 11
xctest[-] string: 👦He▶️♈️llo👦🏼🔴👦🏿🇨🇱🇨🇳🇨🇴🇩🇰🇫 length: 39
xctest[-] string: Hello World! length: 12
xctest[-] string: 🇦🇺🇦🇹🇧🇪🇧🇷🇨🇦🇨🇱🇨🇳🇨🇴🇩🇰🇫🇮 length: 40
xctest[-] string: 1⃣➡️▶️♈️🆗🆖🅰🆘✅㊗️ length: 19


Action



  • Regional Character(0xdde6 - 0xddff)のスキップ


  • Skin tone modifier(0xdffb - 0xdfff)のスキップ


  • Variation selector(0xfe00 - 0xfe0f)のスキップ


  • Zero-width Joiner(0x200d)のスキップ


  • 上記のカウントに伴うsubstring

NSLog(@"string: %@ length: %ld", str, [str actualLength]);

xctest[] string: 🔴🔴🔴🔴🔴 length: 5

xctest[] string: 👦 length: 1
xctest[] string: 👦👦🏿 length: 2
xctest[] string: 👦🏼👦🏿 length: 2
xctest[] string: 👨‍👩‍👧‍👦 length: 4
xctest[] string: 👦He▶️♈️llo👦🏼🔴👦🏿🇨🇱🇨🇳🇨🇴🇩🇰🇫 length: 16
xctest[] string: Hello World! length: 12
xctest[] string: 🇦🇺🇦🇹🇧🇪🇧🇷🇨🇦🇨🇱🇨🇳🇨🇴🇩🇰🇫🇮 length: 10
xctest[] string: 1⃣➡️▶️♈️🆗🆖🅰🆘✅㊗️ length: 10


UnitTest

https://github.com/matsuokah/NSString-ActualLength/tree/master/NSString%2BActualLengthTests

[追記] リネーム漏れがあり、actualLengthのテストが正常に行われていないのにもかかわらず全て成功するというバグがありました。

@miyakeryo@github さん、ご指摘ありがとうございました。(2015/04/29)


Attention

ただしiOS8.3以降の仕様であるZero-width joinerで複数の絵文字をつなげた場合に1つの絵文字にまとめるは1文字としてカウントせず、つなげられている絵文字の数だけカウントされる。

なぜなら、iOS8.2以前及びAndroidで複数の絵文字が展開されるため。


Hipchatのスクショ