Streaming UTF-8 (with node.js)
debuggable.com
debuggable.com
var utf8_length = encodeURIComponent(data).replace(/%../g, 'x').length;
% signs are handled fine - they get encoded into %25 which then gets shortened to a single 'x' character - thus counted as a single byte.
Similarly, for example € gets encoded to "%E2%82%AC" which then gets correctly counted as 3 bytes.
I'm not quite sure what value of 'broken' you're thinking of? Did you try this and find it didn't work in some particular circumstance?
firebug works pretty well for testing out code snippets.
The internet is full of enough incorrect information regarding javascript as it is, and if you think about it, % has to be encoded, otherwise anything containing a % would be decoded wrongly ;)
var len = Buffer.byteLength(a_string, 'utf8')