<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><br><div><div>Le 24 oct. 2013 à 16:24, Mathias Bynens <<a href="mailto:mathias@qiwi.be">mathias@qiwi.be</a>> a écrit :</div><br class="Apple-interchange-newline"><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite"><span class="Apple-tab-span" style="white-space:pre">        </span>text.graphemeAt(0) // get the first grapheme of the text<br><br><span class="Apple-tab-span" style="white-space:pre">        </span>// shorten a text to its first hundred graphemes<br><span class="Apple-tab-span" style="white-space:pre">  </span>var shortenText = ''<br><span class="Apple-tab-span" style="white-space:pre">      </span>let numGraphemes = 0<br><span class="Apple-tab-span" style="white-space:pre">      </span>for (let grapheme of text) {<br><span class="Apple-tab-span" style="white-space:pre">      </span><span class="Apple-tab-span" style="white-space:pre">    </span>numGraphemes += 1<br><span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre">    </span>if (numGraphemes > 100) {<br><span class="Apple-tab-span" style="white-space:pre">      </span><span class="Apple-tab-span" style="white-space:pre">    </span><span class="Apple-tab-span" style="white-space:pre">    </span>shortenText += '…'<br><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">    </span><span class="Apple-tab-span" style="white-space:pre">    </span>break<br><span class="Apple-tab-span" style="white-space:pre">     </span><span class="Apple-tab-span" style="white-space:pre">    </span>}<br><span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre">    </span>shortenText += grapheme<br><span class="Apple-tab-span" style="white-space:pre">   </span>}<br></blockquote><br>So, you would want to change the string iterator’s behavior too?<br></blockquote><div><br></div><div>At least, I'd like to have the opportunity to iterate over what I need. I have no opinion whether iterating through code points, or through grapheme clusters, should be the default</div>iterator, or if there should be none, forcing the developer to consciously pick the one they really mean.</div><div><br><blockquote type="cite"><br><blockquote type="cite">As a side note, I ask whether the `String.prototype.symbolAt `/`<a href="http://String.prototype.at">String.prototype.at</a>` as proposed in a recent thread, and the `String.prototype[@@iterator]` as currently specified, are really what people need, or if they would mistakenly use them with the intended meaning of `String.prototype.graphemeAt` and `String.prototype.graphemes` as discussed in the present message?<br></blockquote><br>I don’t think this would be an issue. The new `String` methods and the iterator are well-defined and documented in terms of *code points*.<br><br>IMHO combining marks are easy enough to match and special-case in your code if that’s what you need. You could use a regular expression to iterate over all grapheme clusters in the string:</blockquote><blockquote type="cite"><br>    // Based on the example on <a href="http://mathiasbynens.be/notes/javascript-unicode#accounting-for-other-combining-marks">http://mathiasbynens.be/notes/javascript-unicode#accounting-for-other-combining-marks</a><br>    var regexGraphemeCluster = /([\0-\u02FF\u0370-\u1DBF\u1E00-\u20CF\u2100-\uD7FF\uDC00-\uFE1F\uFE30-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF])([\u0300-\u036F\u    1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]*)/g;<br></blockquote><div><br></div><div>Note that the specification in [UAX29], section 3.1, for determining grapheme cluster boundaries does not just use the notion of "combining marks". I fear that, for some exotic scripts (apparently, at least Hangul), it is more complicated than just finding a span of combining marks.</div><div><br></div><div>—Claude</div><div><br></div><div><br></div><div>[UAX29]: <a href="http://www.unicode.org/reports/tr29/">http://www.unicode.org/reports/tr29/</a> "Unicode Standard Annex #29: Unicode text segmentation."</div><div><br></div></div><br></body></html>