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で複数の絵文字が展開されるため。