var s0 = 'тест ';
s0 += new Array(1031913 + 1 - s0.length).join('Z');
var s1 = new Buffer(s0, 'ucs2').toString('ucs2');
var s2 = new Buffer(s1, 'utf-8').toString('utf-8');
console.log(s0 === s2);
console.log(s0.substr(0, 200));
console.log(s2.substr(0, 200));
This works under node 0.10 (s0 equals to s2, the example logs 2 equal strings), but breaks in iojs 1.2.0 and 1.4.2 (s0 is not equal to s2, the second logged string is not correct).
When broken, s2.substr(0, 200) somewhy equals to new Buffer(s0, 'ucs2').toString('utf-8').substr(0, 200).
1031913 is the critical length, non-latin strings with length greater or equal to 1031913 trigger the bug, strings with length equal or less than 1031912 do not trigger the bug.
This works under node 0.10 (
s0equals tos2, the example logs 2 equal strings), but breaks in iojs 1.2.0 and 1.4.2 (s0is not equal tos2, the second logged string is not correct).When broken,
s2.substr(0, 200)somewhy equals tonew Buffer(s0, 'ucs2').toString('utf-8').substr(0, 200).1031913 is the critical length, non-latin strings with length greater or equal to 1031913 trigger the bug, strings with length equal or less than 1031912 do not trigger the bug.